网安组新人任务Week1笔记

IDA Pro 静态调试

  • 字符串搜索:Alt+T
  • 搜索下一个:Ctrl+T
  • 反汇编为C代码:F5
  • 修改命令:ALT+F2
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    a:将数据转换为字符串

    f5:一键反汇编

    esc:回退键,能够倒回上一部操作的视图(只有在反汇编窗口才是这个作用,如果是在其他窗口按下esc,会关闭该窗口)

    shift+f12:可以打开string窗口,一键找出所有的字符串,右击setup,还能对窗口的属性进行设置

    ctrl+w:保存ida数据库

    ctrl+s:选择某个数据段,直接进行跳转

    ctrl+鼠标滚轮:能够调节流程视图的大小

    x:对着某个函数、变量按该快捷键,可以查看它的交叉引用

    g:直接跳转到某个地址

    n:更改变量的名称

    y:更改变量的类型

    / :在反编译后伪代码的界面中写下注释

    \:在反编译后伪代码的界面中隐藏/显示变量和函数的类型描述,有时候变量特别多的时候隐藏掉类型描述看起来会轻松很多

    ;:在反汇编后的界面中写下注释

    ctrl+shift+w:拍摄IDA快照

    u:undefine,取消定义函数、代码、数据的定义

解除passwd的限制

  • 执行程序发现程序会打印提示信息 “What’s your password?”,于是在反汇编代码中搜索password字样可找到程序的主流程地址
    9.29.1
    9.29.1
  • 可以看到puts和scanf等字样,不难理解其为输入输出指令
  • 在63和78行可以看到j_strcmp猜测是做字符串比对
  • 6D和82行通过比对结果来判断是否跳转,如果没有跳转则往下执行会输出Wrong
  • 所以可以猜测密码为--diangroup707--或者you_shall_no_pass
  • 将汇编代码转换为C代码也可验证我们的猜想
    9.29.2
    9.29.2

解密过程

  • 上一步密码正确后跳转到loc_41419F
  • loc_41419F获取到输入的code(以%d读取)后跳转到sub_4111A4再跳转到sub_413FA0
  • sub_413FA0做数据初始化,具体的数据看汇编比较难读懂,转成C更容易分析
  • loc_414029for循环条件
  • loc_414051文件存储,可以看出该程序创建了一个名为kp的文件在D盘
    9.29.3
    9.29.3
  • 打开文件发现都是乱码,回头将程序转为C语言查看发现是很麻烦的移位+取异或操作,也难怪汇编代码难看懂……
    9.29.4
    9.29.4

问题回答

  • 解密函数调用了文件操作的一系列API(CreateFile、WriteFile、CloseHandle)
  • 参数是如何传递的
    • 在汇编中参数传递有两种方式:lea传值和使用内存存储
    • 在此程序中将参数扩展后存储在eax通用寄存器中,子程序通过读取AL来获取到参数
  • 谁来清理堆栈
    • 清理堆栈通过push ebp和mov ebp,sep两条指令来完成
    • 在此程序中很多个子程序都会清理堆栈

尝试修改源码

  • 对于源码来说改容易,添加不容易,因为添加需要扩展段的空间
  • 尝试将原来的输出Wrong改为跳转到密码正确的程序部分
  • 但暂时还不会重新打包,新人任务Week2中有关于打补丁的内容,这次就不纠结于这个问题了

x32dbg 动态调试

可参考逆向工程核心原理

  • 依旧是使用字符串搜索password可定位到main函数部分
9.27.3
9.27.3
  • 可继续使用单步调试走完整个流程,大部分代码与静态分析相似
  • CTRL+G 转到指定位置
  • CTRL+E 编辑数据
  • 源码修改即修改指令后打补丁到一个新的exe即可
9.29
9.29