shellcode shortcut

상위문서 → pwntools shortcut

C
shellcode = asm("sub rsp, 0xd0")
shellcode += asm("pop rsi")
shellcode += asm("shr rsi, 32")
shellcode += asm("mov r12, rsi")
shellcode += asm("xor rdi, rdi")

shellcode += asm("push rsi")
shellcode += asm(shellcraft.write( 1 , "rsp" , 0x8 ))

shellcode += asm("push 0x6e7770")
shellcode += asm(shellcraft.write( 1 , "rsp" , 0x3 ))


shellcode += asm("mov rsi, r12")
shellcode += asm("mov rdx, 0x20")
shellcode += asm(shellcraft.read( 0 , "rsi" , "rdx" ))

shellcode += asm("mov rsi, r12")
shellcode += asm(shellcraft.write( 1 , "rsi" , 0x8 ))


shellcode += asm("mov rdi, r12")
shellcode += asm(shellcraft.open( "rdi" , "O_RDONLY"))

shellcode += asm("mov rdi, rax")
shellcode += asm(shellcraft.read( "rdi" , "rsp" , 0x30 ))
shellcode += asm(shellcraft.write( 1 , "rsp" , 0x30 ))

일단 이글은 pwntools로 shellcode를 깔끔하게 작성하기 위한 shortcut 파일이다.

기본적으로 asm() 함수와 shellcraft 함수를 병행하면서 셸코드를 작성한다.

basic - asm()

모든 것에 기본은 asm() 함수로 우리의 어셈블리를 기계어로 변환한 바이트를 반환한다.

기본적인 사용은 일단 intel syntex로 어셈블리어를 작성하면 된다.

C
shellcode = asm("sub rsp, 0xd0")
shellcode += asm("pop rsi")
shellcode += asm("shr rsi, 32")
shellcode += asm("mov r12, rsi")
shellcode += asm("xor rdi, rdi")

상수는 hex와 int형 둘다 지원이 된다.

여기서 중요한점이 있다.

다음과 같이 imm64 사용이 상당히 제한되어 있기에 이를 생각해서 셸코드를 작성해야 한다.

basic - shellcraft()

C

shellcode += asm(shellcraft.read( "rdi" , "rsp" , 0x30 ))
shellcode += asm(shellcraft.read( 0 , "rsi" , "rdx" ))
shellcode += asm(shellcraft.write( 1 , "rsp" , 0x3 ))
shellcode += asm(shellcraft.write( 1 , "rsi" , 0x8 ))
shellcode += asm(shellcraft.open( "rdi" , "O_RDONLY"))

pwntools 에서 사실상 셸코드의 끝판왕으로 상수 , 레지스터를 마음대로 조작이 가능하다.

기본 rdi , rsi , rdx 같은 calling convention을 유지할수도 있고 , 상수를 넣을 수도 있고 , 다른레지스터를 넣을 수도 있다.