B
    „<¾^ÿL  ã            Ï   @   sÐ  d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlmZ d dl	Z	d dl
mZmZmZmZmZmZmZmZ d ZdZdZdZdZdZd	Zd
ZdZdZdZdZdZdZ dZ!dZ"dZ#dZ$dZ%dZ&dZ'dZ(dZ)dZ*dZ+dZ,dZ-dZ.dZ/dZ0dZ1dZ2dZ3dZ4d Z5d!Z6d dl7Z7d d"l7T d d#l7m8Z8m9Z9 d d$l:m;Z; G d%d&„ d&e<ƒZ=e>d'd(d)�Z?e?j@Z@eAeAeBeBge@_CeBe@_Dd*ZEd+ZFd,ZGd-ZHd.ZId/ZJd0ZKd1ZLd2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~dd€d�d‚dƒd„d…d†d‡dˆd‰dŠd‹dŒd�dŽd�d�d‘d’d“d”d•d–d—d–d˜d™dšd›dœd�dždŸd d¡d¢d£d¤d¥d¦d§d¨d©dªd«d¬d­d®d¯d°d±d²d³d´dµd¶d·d¸d¹dºd»d¼d½d¾d¿dÀdÁdÂdÃdÄdÅdÆdÇdÈdÉdÊdËdÌdÍdÎdÏdÐdÑdÒdÓdÔdÕdÖd×dØdÙdÚdÛdÜdÝdÞdßdàdádâdãdädådædçdèdédêdëdìdídîdïdðdñdòdódôdõdöd÷dødùdúdûdüdýdþdÿgÏZM�d �d„ ZN�d�d„ ZO�df�d�d„ZP�ddf�d�d„ZQdf�d	�d
„ZRG �d�d„ �dƒZS�d�d„ ZT�dd3„ ZU�d�d„ ZVeW�dk�rÌe XeVejYd ƒ¡ dS (  é    N)Údefaultdict)ÚLiteralÚWordÚGroupÚForwardÚalphasÚ	alphanumsÚRegexÚSuppressé   é   é   é   é   é   é   é   é	   é   é   é   é   é   é   é   é   é   i B  iB  iB  iB  iB  é    é@   é   é€   i   i    iB  )Ú*)Ú	get_errnoÚcdll)Úfind_libraryc               @   s²   e Zd Zdefdefdefdefdefdefdefdefd	efd
efdefdefdefdefdefdefdefdefdefdefdefdefdefdefdefdefdeffZdS )Úuser_regs_structZr15Zr14Zr13Zr12ÚrbpZrbxZr11Zr10Zr9Úr8ÚraxZrcxÚrdxÚrsiÚrdiÚorig_raxÚripZcsZeflagsÚrspÚssZfs_baseZgs_baseZdsZesZfsZgsN)Ú__name__Ú
__module__Ú__qualname__Zc_ulongZ_fields_© r3   r3   ú./supersafecalc.pyr%   i   s6   r%   z	libc.so.6T)Z	use_errnoi  i  i  i  i   i / i " i 0 ÚreadÚwriteÚopenÚcloseÚstatÚfstatÚlstatZpollÚlseekÚmmapÚmprotectZmunmapZbrkZrt_sigactionZrt_sigprocmaskZrt_sigreturnÚioctlZpread64Zpwrite64ÚreadvÚwritevÚaccessÚpipeZselectÚsched_yieldZmremapZmsyncZmincoreZmadviseZshmgetZshmatZshmctlÚdupÚdup2ÚpauseZ	nanosleepÚ	getitimerÚalarmÚ	setitimerÚgetpidÚsendfileZsocketZconnectZacceptZsendtoZrecvfromZsendmsgZrecvmsgZshutdownZbindZlistenZgetsocknameZgetpeernameZ
socketpairZ
setsockoptZ
getsockoptÚcloneÚforkZvforkÚexecveÚexitÚwait4ÚkillÚunameZsemgetZsemopZsemctlZshmdtZmsggetZmsgsndZmsgrcvZmsgctlZfcntlZflockÚfsyncÚ	fdatasyncÚtruncateÚ	ftruncateZgetdentsÚgetcwdÚchdirÚfchdirÚrenameÚmkdirÚrmdirZcreatÚlinkÚunlinkÚsymlinkÚreadlinkÚchmodÚfchmodÚchownÚfchownÚlchownÚumaskZgettimeofdayZ	getrlimitZ	getrusageZsysinfoZnfoÚtimesÚptraceÚgetuidZsyslogÚgetgidÚsetuidÚsetgidÚgeteuidÚgetegidÚsetpgidÚgetppidÚgetpgrpÚsetsidÚsetreuidÚsetregidÚ	getgroupsÚ	setgroupsÚ	setresuidÚ	getresuidÚ	setresgidÚ	getresgidÚgetpgidZsetfsuidZsetfsgidÚgetsidZcapgetZcapsetZrt_sigpendingZrt_sigtimedwaitZrt_sigqueueinfoZrt_sigsuspendZsigaltstackÚutimeÚmknodZuselibZpersonalityZustatZstatfsZfstatfsZsysfsÚgetpriorityÚsetpriorityÚsched_setparamÚsched_getparamÚsched_setschedulerÚsched_getschedulerÚsched_get_priority_maxÚsched_get_priority_minÚsched_rr_get_intervalZmlockZmunlockZmlockallZ
munlockallZvhangupZ
modify_ldtZ
pivot_rootZ_sysctlZ	sctl_argsÚprctlZ
arch_prctlZadjtimexÚ	setrlimitÚchrootÚsyncZacctZsettimeofdayZmountZumount2ZswaponZswapoffZrebootZsethostnameZsetdomainnameZioplZiopermÚcreate_moduleZinit_moduleZdelete_moduleZget_kernel_symsZquery_moduleZquotactlZ
nfsservctlZgetpmsgZputpmsgZafs_syscallZtuxcallZsecurityZgettidZ	readaheadÚsetxattrZ	lsetxattrZ	fsetxattrÚgetxattrZ	lgetxattrZ	fgetxattrÚ	listxattrZ
llistxattrZ
flistxattrÚremovexattrZlremovexattrZfremovexattrZtkillZtimeZfutexÚsched_setaffinityc              C   s(   ddl m}  dd l }| d  dd¡ d S )Nr   )r#   z	libc.so.6r   r   )Úctypesr#   r‰   )r#   r“   r3   r3   r4   Úpkiller›   s    r”   c             C   s*   d}x |t  | d¡7 }| |¡rP qW |S )Nó    r   )Úosr5   Úendswith)ÚfdÚtstrÚbufr3   r3   r4   Ú	readuntil¥   s    
r›   éÿÿÿÿc             C   sB   |dkrt  | |d¡ x&t  | |¡}||d … }|dkrP qW d S )Nr   r•   )r–   r<   r6   )r˜   rš   ÚposZnwr3   r3   r4   Úwriten±   s    rž   c             C   sj   t  d|  t j¡}|dkr(t  ||d¡ d}x8t  ||t|ƒ ¡}|dkrLP ||7 }t|ƒ|kr.P q.W |S )Nz/proc/%d/memr   r•   )r–   r7   ÚO_RDONLYr<   r5   Úlen)Úpidr�   Útlenr˜   rš   Zcdr3   r3   r4   Úreadmem»   s    r£   c                s4   t jt j t j  d¡‰ d ‡ fdd„t| ƒD ƒ¡S )Nzutf-8r•   c             3   s   | ]}t  ˆ ¡V  qd S )N)ÚrandomZchoice)Ú.0Úi)Úlettersr3   r4   ú	<genexpr>Ì   s    zrnd_str.<locals>.<genexpr>)ÚstringZascii_lowercaseZascii_uppercaseZdigitsÚencodeÚjoinÚrange)r¢   r3   )r§   r4   Úrnd_strÊ   s    r­   c               @   s$   e Zd ZdZg Zdd„ Zdd„ ZdS )ÚBNFPNc                s  g }t dƒ d¡}t dƒ d¡}ttdƒ\}}}}ttdƒ\}}	||B }
||B }|
 d¡ | d¡ tƒ }|
d | ‡ fd	d
„¡| ‡ fdd
„¡B t|| |	 ƒB  }tƒ }||K }|||  ‡ fdd
„¡d  }|||
|  ‡ fdd
„¡d  K }|}|ˆ _d S )Nz\d{1,10}Znumberzv\dÚvariablez+-*/z()Úop.c                s   ˆ j  | d df¡S )Nr   Úvar)Ú	exprStackÚappend)Úx)Úselfr3   r4   Ú<lambda>ä   r•   zBNFP.__init__.<locals>.<lambda>c                s   ˆ j  | d df¡S )Nr   Únum)r²   r³   )r´   )rµ   r3   r4   r¶   å   r•   c                s   ˆ j  | d df¡S )Nr   r°   )r²   r³   )r´   )rµ   r3   r4   r¶   ì   r•   c                s   ˆ j  | d df¡S )Nr   r°   )r²   r³   )r´   )rµ   r3   r4   r¶   í   r•   )	r	   ZsetNameÚmapr   r
   r   ZsetParseActionr   Úparser)rµ   r²   Zfnumberr¯   ZplusZminusZmultZdivZlparZrparZaddopZmultopÚexprZatomZfactorZtermZbnfr3   )rµ   r4   Ú__init__Ó   s$    

6"zBNFP.__init__c             C   sH   |  dd¡}tdd„ |D ƒƒr"dS | d¡}g | _| j |¡}|| jfS )Nó    r•   c             S   s   g | ]}|d k‘qS )s   1234567890+-*/()vr3   )r¥   Úcr3   r3   r4   ú
<listcomp>ó   s    zBNFP.parse.<locals>.<listcomp>)NNzutf-8)ÚreplaceÚanyÚdecoder²   r¹   ZparseString)rµ   r™   ZutstrÚresr3   r3   r4   Úparseñ   s    
z
BNFP.parse)r0   r1   r2   r¹   r²   r»   rÃ   r3   r3   r3   r4   r®   Ï   s   r®   c             C   sÚ   dd„ }g }|  t| ƒ¡ tjtjtjtjtjg}x,|D ]}|| ƒr8|  |j¡ P q8W |  d¡ |  || d? d@ ƒ¡ | d@ d? }dd	d
ddddg}|dkrÀ|d t	|ƒkrÀ|  ||d  ¡ n|  t|ƒdd … ¡ |S )Nc             S   sr   ddddddddd	d
dddddddddddddddddddddg}| d  t |ƒk r^|| d   S t| ƒd!d … S d S )"NÚSIGHUPÚSIGINTÚSIGQUITÚSIGILLÚSIGTRAPÚSIGABRTÚSIGBUSÚSIGFPEÚSIGKILLÚSIGUSR1ÚSIGSEGVÚSIGUSR2ÚSIGPIPEÚSIGALRMÚSIGTERMZ	SIGSTKFLTÚSIGCHLDÚSIGCONTÚSIGSTOPÚSIGTSTPÚSIGTTINÚSIGTTOUÚSIGURGÚSIGXCPUÚSIGXFSZÚ	SIGVTALRMÚSIGPROFÚSIGWINCHÚSIGIOÚSIGPWRÚSIGSYSr   r   )r    Úhex)r·   Zsigsr3   r3   r4   Ú
num_to_sigü   s    Bz parse_status.<locals>.num_to_sigÚ r   éÿ   i  ÿ r   ZPTRACE_EVENT_FORKZPTRACE_EVENT_VFORKZPTRACE_EVENT_CLONEZPTRACE_EVENT_EXECZPTRACE_EVENT_VFORK_DONEZPTRACE_EVENT_EXITÚPTRACE_EVENT_SECCOMPr   r   )
r³   râ   r–   Ú	WCOREDUMPÚ
WIFSTOPPEDÚWIFSIGNALEDÚ	WIFEXITEDÚWIFCONTINUEDr0   r    )Ústatusrã   Zstatus_listZffÚfr/   Zptrace_sigsr3   r3   r4   Úparse_statusû   s     

rî   c             C   s   t jj | ¡ t jj ¡  d S )N)ÚsysÚstdoutÚbufferr6   Úflush)rš   r3   r3   r4   r6     s    c       #   	   C   sN  t  t jd¡ t  t jd¡ |  d¡} t| ƒdkr6dS yt | ¡ W n tk
rX   Y nX t	dƒ t	dƒ t	dƒ t	d	ƒ t
tjjƒ}t|ƒd
kržt	dƒ dS | ¡ }t |¡ ¡ dk�r:ttdƒ�.}| ¡ }t |¡ ¡  d¡d }t	|ƒ W d Q R X tddƒ�.}| ¡ }t |¡ ¡  d¡d }t	|ƒ W d Q R X dS |}g }x”tdƒD ]ˆ}t	dt|ƒ d¡ d ƒ t
tjjƒ}yt|ƒ}W n tk
�r    t	dƒ dS X |dk �s¼|tddƒk�rÈt	dƒ dS | |¡ �qLW tƒ }	t d¡ |	 |¡\}
}|
d k�rt	dƒ dS t	dƒ d}xà|D ]Ø\}}|dk�rZ|t d¡t  !dt|dƒ¡ 7 }|d7 }nš|dk�r¬t|d  dƒ}|t d¡t  !dt"d!|  ¡ 7 }|t d"¡7 }|d7 }nH|d#k�rd$}| #|¡}|t d%¡t  !dt$|d&  ¡ 7 }|t d'¡7 }�qW |t d%¡t  !dt%¡ 7 }|t d(¡7 }|d t&t' … }d)d*„ |D ƒ}| (¡ |  )d¡g| }t*j+}d+g| }t*j,|||d,t-d-�}|j.}|}t /d.d¡\}}t0t1|dt2t3B t4B t5B ƒ t0t6|ddƒ dd dd/œ}t7ƒ }�xŒt /d.d¡\}}t8|ƒ}|d  d0k�rúP |d d1k�r
P |d d2k�r¤t0t9|dt: ;|¡ƒ}|j<}|j<tt=ƒk �rLt=|j< nd3}||k�r–||  d 8  < || dk �r¤d.|_<t0t>|dt: ;|¡ƒ �n|d4k�rî|j?d5k�rÆd.|_<t0t>|dt: ;|¡ƒ |j@dk�r¤d.|_<t0t>|dt: ;|¡ƒ n¶|d6k�rŠ|jAd7k�r d.|_<t0t>|dt: ;|¡ƒ nht d8| tjB¡} t C| |j@tjD¡ tE| d9ƒ}!|!d d.… }!t F| ¡ |!| k�r¤d.|_<t0t>|dt: ;|¡ƒ nd.|_<t0t>|dt: ;|¡ƒ |d d:k�rJt0t9|dt: ;|¡ƒ}|jGdk�r,d|_Ht d8| tjI¡} tJ| t  !d|jH¡|jKd! ƒ t F| ¡ | jKd!8  _K| jKd;7  _Kt$d< |_Lt0t>|dt: ;|¡ƒ t0t6|ddƒ}�qÒW y| M¡  W n tk
�r€   Y nX x<yt /d.d¡\}}t8|ƒ}W n tNk
�r¸   P Y nX �q„W t| dƒ�T}| ¡ }"t  Od|" Pd!d9¡d d!… ¡d }t	d=ƒ t	t|ƒ d¡d ƒ t	d>ƒ W d Q R X yt | ¡ W n tk
�rH   Y nX d S )?N)i€ðúi€ðú)i€Ñði€Ñðzutf-8r   r   s+   Welcome to the safest possible calculator!
s+   Powered by OOO and modern Linux technology
ó   
sF   Send me your math expression (to be safe, I only support +, -, *, /):
iÄ	  s	   Too long
r   Z@5ae2651d8876e3745381383fb265ac7fac7923ed5ca4099f39d19bfa6fe8a04cÚrbZstubé
   s   Give me the value of vs   :
s   Invalid number
r   r   r   i † s   Invalid expression
s   Computing...
r•   r·   Z48bbz<Qó   Sr±   r   r   Z488b1br°   z+-*/Z48b9é   Zffd1Zffe1c             S   s   g | ]}t |ƒ‘qS r3   )Ústr)r¥   Úvr3   r3   r4   r¾   €  s    zmain.<locals>.<listcomp>z./stubT)rð   ÚstderrZ	close_fdsZ
preexec_fnrœ   )r>   rM   r=   rê   rÎ   ræ   Zunkr?   iT  r7   iÿ  z/proc/%d/memó    rË   r   i   s   Result:
s	   Goodbye!
)QÚresourcerŠ   ZRLIMIT_STACKZRLIMIT_DATArª   r    r–   r_   ÚOSErrorr6   Únextrï   Ústdinrñ   ÚstripÚhashlibZsha256Z	hexdigestr7   Ú__file__r5   r¬   rø   ÚintÚ
ValueErrorÚpowr³   r®   ÚsetrecursionlimitrÃ   ÚbytesÚfromhexÚstructZpackÚVARSÚindexÚ	FUNCTIONSÚEXITFÚSTACKÚGCODErâ   rÁ   Ú
subprocessÚPIPEÚPopenr”   r¡   Úwaitpidri   ÚPTRACE_SETOPTIONSÚPTRACE_O_TRACESECCOMPÚPTRACE_O_EXITKILLÚPTRACE_O_TRACECLONEÚPTRACE_O_TRACEVFORKÚPTRACE_CONTr%   rî   ÚPTRACE_GETREGSr“   Z	addressofr,   Úsyscall_tableÚPTRACE_SETREGSr*   r+   r)   rŸ   r<   ÚSEEK_SETr›   r8   r&   r(   ÚO_RDWRrž   r.   r-   rR   ÚChildProcessErrorZunpackÚljust)#ZpfnameÚlineÚfpZcccÚsZtstr2Zintvarsr¦   rù   ZppÚrÚtÚcodeZttypeZvarindexZffstrZfindexZccodeZvvarsÚargsrC   ZfullargsÚpr¡   Zopidrì   Zallowed_syscall_instancesÚregsZparsed_statusrÂ   Zsyscall_numberZsyscall_namer˜   ÚfnameZcontentr3   r3   r4   Úmain  s(   



 

"


"








 r+  Ú__main__)Zr	  r¤   r©   r  r–   rï   r  Úcollectionsr   rü   Z	pyparsingr   r   r   r   r   r   r	   r
   ZPTRACE_TRACEMEZPTRACE_PEEKTEXTZPTRACE_PEEKDATAZPTRACE_PEEKUSERZPTRACE_POKETEXTZPTRACE_POKEDATAZPTRACE_POKEUSERr  ZPTRACE_KILLZPTRACE_SINGLESTEPr  r  ZPTRACE_GETFPREGSZPTRACE_SETFPREGSZPTRACE_ATTACHZPTRACE_DETACHZPTRACE_GETFPXREGSZPTRACE_SETFPXREGSZPTRACE_SYSCALLr  ZPTRACE_GETEVENTMSGZPTRACE_GETSIGINFOZPTRACE_SETSIGINFOZPTRACE_LISTENZPTRACE_O_TRACESYSGOODZPTRACE_O_TRACEFORKr  r  ZPTRACE_O_TRACEEXECZPTRACE_O_TRACEVFORKDONEZPTRACE_O_TRACEEXITZPTRACE_O_MASKr  r  ZPTRACE_O_SUSPEND_SECCOMPZPTRACE_SEIZEr“   r"   r#   Zctypes.utilr$   Z	Structurer%   ZCDLLZlibcri   Zc_uintZc_longZargtypesZrestypeZCODEr  r  r  r  r
  ZSTACKBOTTOMZSTACKENDr  r”   r›   rž   r£   r­   r®   rî   r6   r+  r0   rP   Úargvr3   r3   r3   r4   Ú<module>   s˜   (ÿ £

,
 p