buuctf [GXYCTF2019]luck_guy

前言:学习笔记

常规思路:下载 解压 查壳 

64>>>64IDAPro打开

常规思路:先查找字符串在进入main函数。

东点点 西看看 先了解大致的内容

通过对字符串的东点点 西看看 【肯定是进去过patch_me()的】

再结合main()中 并没有什么有用的东西,可以判断,关键信息在patch_me中。

>>>进入看看。

发现如下

简单的分析 程序逻辑:

观察发现,case1 是我们想要的

case2 case3 是输出一句话  没什么作用

case4 看起来像是对f2进行赋值【此处s是局部变量 >>> 拼接  f2<s】

case5 循环8次。 if ( %2 = 1)执行>>> f2[j] -= 2;   else   执行>>> f2[j+1] (自增) 【对f2的处理】 

 default 不管不重要  =。=

思路:

发现:有用的case只有 1 4 5 

把case1作为切入点。【因为我们想得到flag【s】】        case1中 s等于 f1 + f2 (f1已知。) f2(未知)

关键就是求f2。

>>>而f2在case4 和case5 中有操作。 【case4是赋值(strcpy、strcat)、case5是某种算法】

case4 >>> 赋值 >>> f2 []= {0x69,0x36,0x75,0x67,0x60,0x6F,0x66,0x7F,0【结尾】};

【为什么这么写?>>>你把rbp+s 当作address # +1 +2...看作offset >>address+offset->数组寻址】

case5>>> 变形>>>对原f2的值进行处理。

猜测程序完整执行顺序应该是,先进行case 4 再进行case 5 最后执行 case 1。

直接还原该过程。(照抄就行了。)

C脚本:

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值