• 程序运行:

只能输入数字序列,不能输入字母和字符

  • 查壳,无壳,标准c++程序:

我在想,能不能爆破,嘿嘿嘿,但是我不会写相应的脚本。

  • IDA打开,String,找到    "Correct!"

  • 查看调用的函数,找到获取输入内容的函数GETDlgItemInt,获取后转为int类型
  • OD动态调试,找到IDA中对应的0040509C这个地址,之后发现这个地址似乎不存在,我也不知道为什么,找了一会儿 ,才找到这个函数调用的指令位置(0040105A),赶紧下个断点:

    找到了 correct! 的位置

  • 在correct 之前找到一个,想着输入一个:强制跳转指令(jmp 00404690),把它nop(90)掉,但是依照这个函数传递的参数来看,它不会直接打印出flag,而是要满足条件,它会提示你,输入正确,而这个正确的输入就是flag

  • 运行一下,输入 124,点击Check按钮,运行到文本获取函数的调用位置(0040105A)
    之后单步步入(F7),进入Replace.0040466F,它实际上的操作是一个赋值的过程,之后就return掉了,这的没什么影响,程序也不会停止。但是有个疑问,为什么跳转的命令一样,实际上跳转到的地址却不一样。后来才知道,原来是call指令前面的mov指令改变了0x40466F的偏移地址的数据,之所以下面的会访问另一个地址,是因为下面的call指令也改变了偏移地址0x40466F的数据,第三个没有改变。

    第一次对于Replace.0040466F的调用是与下面的对于这个地址的调用产生了不同的汇编指令,这个是对偏移地址的赋值,而下面的是对于寄存器的里面存储的地址进行操作。

    第二次:
    但是向下运行,之后还有两个Replace.0040466F,它们运行会直接结束程序。
    F7 进去之后,发现,这个函数是对eax的赋值,即赋值为0x90,之后程序结束,为什么?
    看看大佬博客,直接结束程序的原因是eax存储的地址访问不到
    这次输入的是124,对应地址是60160647


  • 在经过两次Replace.0040466F的调用之后,又回到了,两个强制jmp的地方,第一个jmp是跳下去,第二个jmp是跳过setDlgItemTextA函数(打印出correct的函数),然后下面的jmp又跳了回来,从而执行第二个jmp,但是还是会跳过correct。

重新运行

  • 这次输入0,看看eax的值会是多少,601605CB

124,对应地址是60160647                  十进制....1607

0    ,对应地址是601605CB                 十进制.....1483

之间正好错开124,所以这里有个基本数据601605CB,它加上输入框中的数据,就构成了eax的值。

  • 可以很好的利用一下0040466F处函数的nop指令(0x90),其思想为:

    因为eax里的地址可以被赋值,而Replace.0040466F处的jmp指令如果跳转为0x90,那这里的指令就会被nop替换掉,就直接会向下进行执行相应的 显示 correct 操作。所以,看到跳转函数之前有两个Replace.0040466F,第一个用来将eax的值赋值为 00401071 ,第二个就用来将这个eax中的00401071 赋值为 0x90
    列个式子(x代表输入):
                     601605CB + x = 00401070
                               等于00401070的缘故是因为下面还有个 inc eax

    显然x是个负数,所以需要构造一个数,使得结果溢出,即 x = 100401070 - 601605CB 。
    算出来,x应该是A02A0AA5,转一下10进制:2687109797,好奇怪,为什么是2687109798,难道inc 指令没起效果?

  • 看一眼原因:

    第一个call Replace.0040466F 之后,eax 为 00401071

    inc eax之后,eax为00401072,之后就调用了第二个Replace.0040466F 

    回想一下刚才的这里存在的jmp short Replace.00401084现在它转化为了两个字节,即两个指令:nop nop(字节是内存的最小单位),不知道是不是因为jmp 遇上nop之后会自动转化为nop。

    这里得出原因,我们要修改的就是内存 00401072 的值,cpu会自动识别其是不是指令 ,然后进行优化

知识点

  • BOOLSetDlgltemText(HWND hDlg,int nlDDlgltem,LPCTSTR IpString);
    设置对话框中控件的文本和标题
    hDlg:指定含有控件的对话框。
    nlDDlgltem:标识带有将被设置的标题和文本的控件。
    IpString:指向一个以NULL结尾的字符串指针,该字符串指针包含了将被复制到控件的文本。
  • UINT GetDlgItemInt(
    HWNDhDlg, // 窗口句柄
    int nIDDlgItem, // 控件标识符(名称)
    BOOL *lpTranslated, // 布尔变量的指针
    BOOLbSigned // 有符号或无符号值
    );
    该函数通过剥离文本开头的任何额外的空格,然后转换十进制数字来翻译检索到的文本。 该功能在到达文本末尾或遇到非数字字符时停止转换。
    例子:int a = GetDlgItemInt(hwndDlg,IDC_a,NULL,TRUE);
    注释:用GetDlgItemInt函数获取hwndDlg窗口中的IDC_a控件中输入的数值并赋给变量a。
  • BOOL EndDialog(HWND hDlg,int nResult);
    清除一个模态对话框,并使系统中止对对话框的任何处理的函数
    hDlg:表示要被清除的对话框窗口。
    NResult:指定从创建对话框函数返回到应用程序的值。

Reversing.kr Replace相关推荐

  1. Reversing.Kr replace题解

    第一次尝试做题,参考了众多大神的讲解,终于把这题解出来了. 我们先运行一下replace.exe,出现下面的框,什么都不输或输错点击check会异外终止.这题估计就是要让Wrong变成correct或 ...

  2. 170925 逆向-Reversing.kr(Replace)

    1625-5 王子昂 总结<2017年9月25日> [连续第358天总结] A. Reversing.kr-Replace B. Replace 先查一波壳,还好没有 运行,是一个GUI程 ...

  3. 170929 逆向-Reversing.kr(Ransomware)

    1625-5 王子昂 总结<2017年9月29日> [连续第362天总结] A. Reversing.kr-Ransomware B. Ransomware readme提示解密文件,运行 ...

  4. 171003 逆向-Reversing.kr(CSHOP)

    1625-5 王子昂 总结<2017年10月3日> [连续第368天总结] A. Reversing.kr-CSHOP B. CSHOP 这次只有一个文件,没有可怕的ReadMe了 打开是 ...

  5. 171002 逆向-Reversing.kr(AutoHotKey)

    1625-5 王子昂 总结<2017年10月2日> [连续第367天总结] A. Reversing.kr-AutoHotKey B. AutoHotKey 解压出来一个ReadMe一个e ...

  6. 171013 逆向-Reversing.kr(AutoHotKey2)

    1625-5 王子昂 总结<2017年10月13日> [连续第378天总结] A. reversing.kr B. AutoHotKey2 解压出来又来了ReadMe 不过这次比较简单,翻 ...

  7. 171019 逆向-Reversing.kr(MetroApp)

    1625-5 王子昂 总结<2017年10月19日> [连续第384天总结] A. reversing.kr B. MetroApp 这次的逆向处理了很多麻烦,学到了不少关于MetroAp ...

  8. reversing.kr学习之路-ransomeware

    ransomeware - writeup 题目来源 http://reversing.kr 题目知识点:upx + 花指令 + 堆栈不平衡 + exe特征码提取key 前言 文章只是记录一下自己在r ...

  9. 170926 逆向-Reversing.kr(ImagePrc)

    1625-5 王子昂 总结<2017年9月26日> [连续第359天总结] A. Reversing.kr-ImagePrc B. ImagePrc 首先查壳,运行发现是一个光秃秃的窗口, ...

最新文章

  1. <%=(String)request.getAttribute(““) %>的作用是什么
  2. CTR模型越来越深,如何让它变轻?
  3. PHP的xdebug五个按钮的说明
  4. Shell编程之条件语句(if语句,case分支语句)
  5. Linux进程 excel族函数的用法
  6. trafficserver records.config参数说明
  7. 使用MyBatis框架连接MySQL数据库查询记录,全部步骤
  8. 窗体之间传递值的几种方法
  9. 深度学习:NLP之词嵌入(Word Embedding)
  10. linux常用命令行编辑快捷键
  11. 如何查看手机的android版本信息,怎么查看手机型号、配置、版本【图文教程】...
  12. 网络安全实验3 漏洞扫描
  13. 计算机boot指令,BCDBoot 命令行选项
  14. ICCV 2021 | Transformer结合自监督学习!Facebook开源DINO
  15. CTeX 中文 beamer 模板
  16. halcon学习实战系列—如何更便捷,更高效的计算同心度
  17. [H265/HEVC] 波前并行处理WPP
  18. HTML+CSS静态网页作业:NBA勒布朗詹姆斯篮球明星带js(5页)
  19. STM32CubeMX(09)MG90S舵机驱动实验
  20. Haproxy(一)基础介绍

热门文章

  1. R语言 | 批量修改变量类型(比如:把所有字符型变量转化为因子型)
  2. 【水】OpenHarmony开源见面会分享
  3. 小米盒子的远程安装实现
  4. 传统向量空间模型的缺陷
  5. 5、【接口测试用例与ui功能测试用例有什么区别?】
  6. C语言实现计算IPV6的subnet_id
  7. c++ cin加速器
  8. 【STM32 嵌入式课程实验】实验一 单个LED灯的闪烁
  9. Dll注入过滤任意Windows控制台命令行输入
  10. unity2d小游戏