re学习(34)攻防世界-csaw2013reversing2(修改汇编顺序)

这篇具有很好参考价值的文章主要介绍了re学习(34)攻防世界-csaw2013reversing2(修改汇编顺序)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

参考文章:

re学习笔记(27)攻防世界-re-csaw2013reversing2_Forgo7ten的博客-CSDN博客
攻防世界逆向入门题之csaw2013reversing2_沐一 · 林的博客-CSDN博客

三种做法

1、ida静态分析修改指令

main函数反编译的代码

re学习(34)攻防世界-csaw2013reversing2(修改汇编顺序),# 每天一个CTF,学习

由于运行之后的是乱码,所以可以猜测生成flag的函数没有执行,所以需要跳到生成flag的函数执行,但是前面的中断函数不能执行,需要nop掉,并且后面退出程序的函数不能执行,需要跳到弹框函数继续执行。(修改的路径和文件名不要有中文,我用ida修改的时候踩了坑,大家可以试一试)

一.ida修改代码的方法:

1、鼠标停留在要修改的汇编代码上,然后点击Edit > Patch program > Assemble(中文:编辑 > 修补程序 > 汇编)

2、修改完成后:Edit > Patch program > Apply pathes to input file > OK(中文:编辑 > 修补程序 > 修补程序应用到输入文件 > 确定)

二.IDA图形视图讲解:

图形视图将一个函数分解成许多基本块,以生动显示该函数由一个块到另一个块的控制流程

基本块是一个不包含分支,从头执行到尾的最大指令序列

基本块中的第一条指令通常是分支指令的目标,而最后一条指令则往往是一条分支指令

re学习(34)攻防世界-csaw2013reversing2(修改汇编顺序),# 每天一个CTF,学习

IDA 使用不同的彩色箭头区分函数块之间各种类型的流

正常流(也叫做普通流)表示指令默认连续执行,跳转流表示当前的指令跳转到(或可能跳转到)某个非连续性位置,调用流表示当前指令会调用一个子例程

根据测试条件,在条件跳转位置终止的基本块可能会生成两种流:Yes 边的箭头(是的,执行分支)默认为绿色,No 边的箭头(不,不执行分支)默认为红色

只有一个后继块的基本块会利用一个正常边(默认为蓝色)指向下一个即将执行的块

在图形模式下,IDA 一次显示一个函数

使用滑轮鼠标的用户,可以使用“CTRL+鼠标滑轮”来调整图形的大小

修改之前的汇编代码

re学习(34)攻防世界-csaw2013reversing2(修改汇编顺序),# 每天一个CTF,学习

修改之后的汇编代码

re学习(34)攻防世界-csaw2013reversing2(修改汇编顺序),# 每天一个CTF,学习 修改完成之后,直接运行文件,得到flag

re学习(34)攻防世界-csaw2013reversing2(修改汇编顺序),# 每天一个CTF,学习

2、ollydbg动态调试,nop大法

将文件导入ollydbg后,直接右键 > 中文搜索引擎 > 智能搜索,找到Flag

re学习(34)攻防世界-csaw2013reversing2(修改汇编顺序),# 每天一个CTF,学习 双击之后向上找到IsDebuggerPresent函数,点击这句汇编,下断点,重新载入

re学习(34)攻防世界-csaw2013reversing2(修改汇编顺序),# 每天一个CTF,学习

F8两次,发现一个跳转,根据之前ida的分析,这应该就是那个if语句的判断,跳过的中间部分就是生成flag的函数,所以我们把这个跳转nop掉 

re学习(34)攻防世界-csaw2013reversing2(修改汇编顺序),# 每天一个CTF,学习

 继续F8执行,执行到int 3,这是中断语句,所以也nop掉

re学习(34)攻防世界-csaw2013reversing2(修改汇编顺序),# 每天一个CTF,学习

 F8执行完生成flag的函数后,后面有一个大跳转,跳到退出程序的函数

 re学习(34)攻防世界-csaw2013reversing2(修改汇编顺序),# 每天一个CTF,学习

所以我们把这个跳转也给nop掉,继续F8,执行完一个MessageBoxA(弹框)函数后,发现程序此时处于Running状态,弹出一个什么也没有的框,其实这是另外一个弹框函数,真正输出flag的弹框函数是后面那个,在我们之前那个ida的修改之后的汇编图也可以发现,确实是有一个没有被调用的弹框函数,所以我们之前可以那个nop掉的跳转改为跳转到下面那个弹框函数,但既然说了是nop大法,就nop到底

re学习(34)攻防世界-csaw2013reversing2(修改汇编顺序),# 每天一个CTF,学习

 点击中止之后,发现又要执行一个跳转,跳过了我们真正的弹框函数

re学习(34)攻防世界-csaw2013reversing2(修改汇编顺序),# 每天一个CTF,学习

将这个跳转nop掉,接着F8,就可以看到flag了

re学习(34)攻防世界-csaw2013reversing2(修改汇编顺序),# 每天一个CTF,学习

3、 分析代码写脚本

main函数代码

int __cdecl __noreturn main(int argc, const char **argv, const char **envp)
{
  int v3; // ecx
  CHAR *lpMem; // [esp+8h] [ebp-Ch]
  HANDLE hHeap; // [esp+10h] [ebp-4h]
 
  hHeap = HeapCreate(0x40000u, 0, 0);
  lpMem = (CHAR *)HeapAlloc(hHeap, 8u, MaxCount + 1);
  memcpy_s(lpMem, MaxCount, &unk_409B10, MaxCount);
  if ( sub_40102A() || IsDebuggerPresent() )
  {
    __debugbreak();
    sub_401000(v3 + 4, lpMem);
    ExitProcess(0xFFFFFFFF);
  }
  MessageBoxA(0, lpMem + 1, "Flag", 2u);
  HeapFree(hHeap, 0, lpMem);
  HeapDestroy(hHeap);
  ExitProcess(0);
}

 关键函数sub_401000的两个参数,v3后面没有用到,向上找lpMem的赋值语句,memcpy_s,将unk_409B10地址的值给了它,双击查看

re学习(34)攻防世界-csaw2013reversing2(修改汇编顺序),# 每天一个CTF,学习

 进入sub_401000函数内部,代码

unsigned int __fastcall sub_401000(int a1, int a2)
{
  int v2; // esi
  unsigned int v3; // eax
  unsigned int v4; // ecx
  unsigned int result; // eax
 
  v2 = dword_409B38;
  v3 = a2 + 1 + strlen((const char *)(a2 + 1)) + 1;
  v4 = 0;
  result = ((v3 - (a2 + 2)) >> 2) + 1;
  if ( result )
  {
    do
      *(_DWORD *)(a2 + 4 * v4++) ^= v2;
    while ( v4 < result );
  }
  return result;
}

 a2也就是lpMem,发现后面的异或语句有v2,向上找v2的赋值语句,找到v2 = dword_409B38,双击dword_409B38,找到内容

re学习(34)攻防世界-csaw2013reversing2(修改汇编顺序),# 每天一个CTF,学习

这里是四个字节显示的,又由于小端存储,所以顺序是颠倒的,我们可以将其转换成一个字节查看

re学习(34)攻防世界-csaw2013reversing2(修改汇编顺序),# 每天一个CTF,学习

wp:
 

x=[0xbb,0xaa,0xcc,0xdd]
y=[0xBB,0xCC,0xA0,0xBC,0xDC,0xD1,0xBE,0xB8,0xCD,0xCF,0xBE,0xAE,0xD2,0xC4,0xAB,0x82,0xD2,0xD9,0x93,0xB3,0xD4,0xDE,0x93,0xA9,0xD3,0xCB,0xB8,0x82,0xD3,0xCB,0xBE,0xB9,0x9A,0xD7,0xCC,0xDD]
i=0
z=[]
while i<len(y):
    t=chr(y[i]^x[i%4])
    z.append(t)
    i+=1
print(z)
print(''.join(z))

['\x00', 'f', 'l', 'a', 'g', '{', 'r', 'e', 'v', 'e', 'r', 's', 'i', 'n', 'g', '_', 'i', 's', '_', 'n', 'o', 't', '_', 't', 'h', 'a', 't', '_', 'h', 'a', 'r', 'd', '!', '}', '\x00', '\x00']
flag{reversing_is_not_that_hard!}

这里就可以知道为什么调用第一个弹窗会输出空白,因为第一个弹窗函数,是直接从第一个字符输出的,但是第一个字符解码后为'\0',直接截断,所以会输出空白,第二个弹窗是从lpMem+1开始输出的文章来源地址https://www.toymoban.com/news/detail-661205.html

到了这里,关于re学习(34)攻防世界-csaw2013reversing2(修改汇编顺序)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 攻防世界-warmup

            只有一张图片,就查看源代码,有一个source.php。          查看source.php,白名单中还有一个hint.php。          hint.php告诉我们flag的位置ffffllllaaaagggg          但是直接跳转是没用的,构造payload。    

    2024年02月12日
    浏览(69)
  • 1、攻防世界第一天

    1、网站目录下会有一个robots.txt文件,规定爬虫可以/不可以爬取的网站。 2、URL编码细则:URL栏中字符若出现非ASCII字符,则对其进行URL编码,浏览器将该请求发给服务端;服务端会可能会先对收到的url进行解码,然后交给后端代码。 3、Post传参 将头部中第一行中的GET改成P

    2024年02月12日
    浏览(33)
  • 攻防世界ics-06

    题目描述:云平台报表中心收集了设备管理基础服务的数据,但是数据被删除了,只有一处留下了入侵者的痕迹。 打开场景,查看页面。 但凡有超链接的都点一遍,发现只有“报表中心可以打开”。 选择日期范围,点击确定,页面无变化。准备截包,打开burpsuite,设置监听

    2024年02月16日
    浏览(48)
  • 攻防世界-baigeiRSA

    1.下载附件,得到压缩包,解压得到两个文件。    2.分析过程。 根据题目得到是RSA算法。 RSA是一种常用的非对称加密算法,由Ron Rivest、Adi Shamir和Leonard Adleman在1977年提出。它的安全性建立在大质数分解的困难性上,可以用来实现数据的加密和数字签名。RSA算法的基本原理是

    2024年02月13日
    浏览(35)
  • 攻防世界——dmd-50

    名字就告诉了我们这道题是md5加密 MD5加密就是把你给的任意长字符串转换为一个128位(16字节)的字符串,常用语数字签名        虚拟机跑了一下,看得出来是第一类,需要找到key或者直接拿 很明显的一段密文,提取出来 870438d5b6e29db0898bc4f0225935c0 md5在线解密破解,md5解密加

    2024年01月23日
    浏览(39)
  • 攻防世界pcap1

    题目描述:无 题目环境:https://download.csdn.net/download/m0_59188912/87016888 打开xxxxx.pacpng,协议分级。 发现主要数据在tcp中,过滤tcp流量寻找flag。 追踪流。 发现这里面的数据是python,将其另存为python,进行代码审计,将python代码进行添加与修改,运行。(python我不是太懂,这里参

    2024年02月13日
    浏览(42)
  • 攻防世界(fileinclude)

    记录一道简单的文件包含题,攻防世界的fileinclude。 打开环境 页面给出了flag在flag.php中,明确了目标,看一下网页源码 主要部分 $lan=$_COOKIE[\\\'language\\\'];        ==        $lan由cookie传入 if条件中        ==        $lan不存在则包含english.php,存在则会将$lan的值拼接.php然后进

    2024年02月13日
    浏览(39)
  • 攻防世界-fileinclude

    题目说flag在flag.php中,通过ctrl+uc查看源码,考虑文件上传漏洞。源码如下图所示: 源码如下: 大意是取cookies中lan的值,如果不是0,则执行cookies中名为english的php php://filter php://filter 是一种元封装器, 设计用于数据流打开时的筛选过滤应用。 这对于一体式(all-in-one)的文件

    2024年04月17日
    浏览(41)
  • 攻防世界pwn难度1

    首先用IDA进行静态分析 可以看到有一个输入函数 后门函数,直接执行system()   记下函数地址 0x400762 gdb动态分析   走到read函数的位置输入后查看栈   b8 - 10 = 168 需要输入168个字节,再用backdoor的地址覆盖main+34的返回地址即可 编写脚本  最后 cat flag

    2024年02月12日
    浏览(43)
  • 攻防世界easyupload (web新手)

    典型的文件上传,本题涉及知识点 文件上传漏洞 .user.ini绕过 其实这个题目是文件上传漏洞中相对来说不是很常见的题目,说实话也是涉及了我的知识盲区,在此之前我对文件上传漏洞有一些总结如下,都尝试过后发现没有能用的。 1. JavaScript 防御 检测发生在浏览器端(本地

    2023年04月16日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包