8.2wp

0x01 warmup

。。。warmup已经让我这个萌新很爽了

Tools

Disassembler: 反汇编(ida)
Tracer: 记录程序的运行线路,跟踪参数/函数
Debugger: 调试器(gdb?) 
Decompiler: 反编译(ida hex\JEB)
Emulator: 模拟执行指令(Qemu)
Symbolic Execution: 符号执行(大名鼎鼎安格尔(angr))

反汇编/编译方面:
IDA 强无敌
JEB 安卓/mips
binaryninja (不支持反编译)/ API 好用

调试:
OD windebug
gdb

跟踪:
pin API
IPT inter processor trace

ndis

re0

先程序解密:
judge函数被加密
这里写图片描述
在ida里面可以运行python脚本 直接复制可以运行(记得敲两下回车)

judge=0x600B00
for i in range(182):
    addr=0x600B00+i
    byte=get_bytes(addr,1)
    byte=ord(byte)^0xC
    patch_byte(addr,byte)

改结尾地址(右键 编辑函数)
取消函数定义/再重定义(c+p(Define))
会发现和 i i 异或 逆着异或回去就OK了

flag_enc="fmcd\x7fk7d;V\x60;np"
flag=""
for i in range(len(flag_enc)):
    c=flag_enc[i]
    flag+=chr(ord(c)^i)

print flag

Tips&Skills

在ida里面可以运行python脚本 直接复制可以运行(记得敲两下回车)
改结尾地址(右键 编辑函数)
取消函数定义/再重定义(c+p(Define))

re1

找一下MessageBoxA,这个是一个弹窗的函数。那么这个什么是偶会弹窗口呢?
两种可能:1 点了曹操
2 点了注册,弹出正确or错误的窗口。
我们不知道是哪个,所以要排除。
找到调用MessageBoxA的地方(在函数头用右键+X)
然后我们发现两个调用的地方都调用了同一个函数
sub_4016A0(20, &x),这个MessageBoxA是带了参数的,所以这个应该就是调用窗口导致的,与flag相关。
但我们没找到关于flag的判断,所以估计是把判断传了下来导致的。
我们再在汇编里面找这个4016A0的调用 发现他在text段里,之前调用了401630,然后传参数到4016A0
这时候,就成功找到flag的比较函数了。
此时我们有两种做法:
一、按着思路写一个解密算法

8.2wp_第1张图片
先看看这个v3,也就是flag的字符集在哪
跳到ebp+96地址发现就是那个长长的字符串

8.2wp_第2张图片
然后用C照着写一个就OK了

8.2wp_第3张图片
跑一下就出了flag

二、把cmp给patch成mov,然后找到输入数据的储存地址,在调试过程中得到flag flag{The-Y3ll0w-turb4ns-Upri$ing}

8.2wp_第4张图片
记得把al寄存器的东西拿回来。

Tips&Skills

MFC题目(???)
X找调用
Ctrl+S找字符串
ALT+TS找特定字符串
跳过判断:把cmp给patch成mov
(对寄存器要熟悉)
patch
*Ida使用技巧
X跳地址可能会跳到text段,此时可能是ida无法成功反编译的原因,在函数头(push 寄存器)的地方按一下P(定义一个函数)即可。

Evr

没法F5main,sp-analysis fail,栈帧不平衡
G跳转到出问题的地址,用ALT+K瞎jb改,基本原则就是改成相同(平衡),改了还不能过F5就往上往下改,或者哪里出问题改哪里。
然后就可以F5进去分析慢慢逆了

这个题基本思路是爆破,dump出flag的密文就可以根据逆向的过程,捋顺逻辑,枚举可见字符,找到满足的输出就可以了。
可以自己逆,也可以用angr的符号执行逆(atum大哥的代码)。
逻辑就是一些位移+异或而已,直接3次爆破就可以解决问题。

Tips&Skills

lazyida github
Y改数据类型
可见字符逐位爆破
自动化逆向(angr)
233是jmp的机械码 出现了只是判断断点 防止此处下断点
还可能出现防调试的判断函数来混淆

0x02 Regular Problem

下面就只是一些听课时侯的杂乱笔记了,毕竟蛮多还是听不懂。今天光是warmup就已经收获良多了。

string一下 去github找一找 有源码就打完了 (识别开源化代码)
定位关键代码!
关注人写的代码 编译器加的代码/库函数代码可以猜猜看但没必要逆
非C语言编译出来的都是静态链接 编译器生成的代码有一定的的规律
关aslr 再exit前下断点 在内存里面找自己的数据 在数据下断点(读写断点) 找逻辑

动态分析:
OD
找关键代码 验证自己猜的对不对
调试 trace 符号执行

动态调试技巧有PPT!

逆向要按块逆向,不需要太过于细节,需要逆细节再逆(自己对代码的敏感度要高)
segsearch ida插件 (常见加密算法认识一哈 crypto?
还有数据结构和算法

混淆解决方案:
一般方法:知道混淆的原理,尝试恢复控制流
ollvm—Google “符号执行 ollvm 腾讯写的”
movfuscator —-
vm/self modify
。。。。

壳(Packer):
用来保护核心代码,种类很多。
恶意软件 病毒 自己写壳保护自己
现在的杀毒 如360 不认识的壳通杀
esp找OEP 然后dump

反调试:
windows anti-debug
检测调试器/干掉调试器/自己开调试器调自己

0x03

听说明天题目会上一个台阶
看到题目列表里vtp才排难度3我心里已经有点b数了
TCTF的时候对着发了8h+的呆的题目

ConanC

你可能感兴趣的:(题解,总结)