MailBox Step2

上次的mailbox还有一个step2,提示是目录文件下面还有一个flag文件,需要getshell。hint也给出了要ret2libc。那么题目意思已经很明白了。可惜我是一只渣,什么都不会。反复思考了一个星期还是没有结果。最后发现了一篇大神的writeup,也是差不多的题目。瞬间脑洞大开,会了。
上一次的step1已经找到了一个栈溢出的漏洞,但是其实程序还有一个漏洞。

1
2
3
4
5
.text:0804937C                 call    get_input
.text:08049381 mov dword ptr [esp], offset aTitle ; "Title:"
.text:08049388 call _printf
.text:0804938D mov eax, [ebp+title]
.text:08049390 mov [esp], eax ; format <-直接print一个title

除了我这种渣渣,估计都应该知道这种有名的格式化字符串漏洞了吧。因为服务器上什么nx,aslr,所以还需要动态的计算system和\bin\sh的地址。不过有经验人应该都可以想到,程序入口点start函数会调用libc中的libc_start_main,然后再回调main函数。这样main函数的栈帧下方肯定有libc的地址。用printf的漏洞就可以打印出来。因为服务器已经挂了,所以不能把栈打印出来了。主要思路是

“%e”*45+”%x”

前面的是360个字节废数据,然后是call main的返回地址。在libc里面找到libc_start_main

1
2
3
4
5
6
7
8
9
10
11
12
13
env= dword ptr -6Ch
var_68= dword ptr -68h
var_64= dword ptr -64h
var_54= dword ptr -54h
var_50= dword ptr -50h
var_48= byte ptr -48h
var_2C= dword ptr -2Ch
var_28= dword ptr -28h
addr_of_func= dword ptr 4 <--函数的第一个参数
arg_4= dword ptr 8
arg_8= dword ptr 0Ch
arg_C= dword ptr 10h
arg_14= dword ptr 18h

看看start处的代码可以发现,其实就是main函数的地址,改成addr_of_func,往下找调用。

1
2
3
.text:00019A7F                 call    [esp+6Ch+addr_of_func]
.text:00019A83 mov [esp+6Ch+env], eax
.text:00019A86 call exit

可以看到刚才打印的返回地址就是指向这里的。libc的基地址就可以得到了。

base=ret_addr - 0x19A83

然后system和/bin/sh的地址就可以动态的算出来了。

addr_system = base + 0x40190
addr_str = base + 0x160A24

该找的东西都找到了,那么构造溢出数据就行了。

ret_addr = addr_system
ret_addr + 8 = addr_str

如何溢出的部分已经step1里面提及过了,这里就不说明了。
然后渣渣又来用c写代码了,写了快300行你伤不起啊!!!以后用心学python去。
代码太长我就不贴了(反正没人看

PS:最后我已经getshell了,ls一下就在根目录下面。然后。。。。。
liunx下这么看文件来着,只用window的完全不知道啊!你能体会看着flag文件打不开的感觉吗?