入门

先回顾下最近所学的

  • 从最基本的普通逆向到异或操作,学好语言看感觉逆向

  • 学会使用ida,现在知道的操作罗列一下

    1
    2
    3
    4
    5
    1. f5 编译为c语言
    2. shift f12 找字符串
    3. alt f7 使用脚本
    4. 混淆字,当看到红字或者地址+1/+2的时候可以按u 然后按c进行分析(code)
    5. 快捷键r可以直接分析为字符串

    其余的不是那么重要

  • 又刷了base64的题目,转到目录python底下有介绍

  • 之后是upx壳,只知道打开upx.exe

    1
    upx -d 文件

    就可以脱壳了

  • 花指令也只是看ida里无法反汇编标红的地方,将那个地方修复了即可,也只是将编辑打开,把E9改为90

  • 要注意linux环境和windows环境下的种子是不同的,答案不对可以试试

  • 当函数一个套一个找不到结尾的时候,按下x使用xref流,寻找w,写来找到关键点

  • python pyinstxtractor.py 文件名.exe python反编译,当遇到pyc可以使用

1. number-mashing

  • 一道老早之前做的整数溢出题,现在找回来再来一遍
  1. 这需要读懂ARM汇编

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    1. mov是一样的作用
    2. 主要是几个栈的动用
    (1)STR X1, [SP,#0x130+var_8]
    将 X1 的值存储到栈中偏移量为 0x130 + var_8 的位置。

    (2)LDR X1, [X0]
    从 X0 指向的地址中读取数据到 X1

    (3)ADD X1, SP, #0x130+var_118
    将栈中某个位置的地址赋给 X1,用于存储输入的第一个数字。

    image-20241010211537092

    这里我们输入两个数,第一个数是X0,第二个数是X1

    1
    也就是x是在11C y在118
  2. 分析

    • x=0,程序终止

image-20241010212228817

  • y=0,程序终止

image-20241010212357932

  • y!=1,程序继续执行

    image-20241010212456203

1
总的来说就是   (x != 0 && y != 0 && y != 1) 
  1. 算法

    image-20241010212602965

    1
    2
    最核心的地方,W1(x)/W0(y)放到W0(118)里,W0(x/y)放到114,把11C(x)给W0,把114(x/y)给W1
    比较W1和W0,相等,得到flag
    1
    但是y!=0和1  x/y==x想了半天也没有符合的,最后想到整数溢出
    • 在 C 中,int 类型的大小通常是 32 位,尤其是在常见的编译器(如 GCC、Clang 和 MSVC)中,即使在 64 位系统上,int 仍然通常为 32 位。
    • 因此-2147483648和2147483648补码相同 所以让x=-2147483648,y=-1,就是正确答案

2.[KPCTF 2024 决赛]REsignin_revenge

  • 一串以太坊字节码

    1
    0x6000601d9050611ce3016022016020901b6309a90782600202017fffffffffffffffffffffffffffffffffffffffffffffffffffffa7a7b3cfa9cc191865666666abcdef653a1e2d49f19665123456789abc654d494b55585918180600

    Bytecode to Opcode Disassembler | Etherscan

    扔进这里

    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
    [1] PUSH1 0x00
    [3] PUSH1 0x1d
    [4] SWAP1
    [5] POP
    [8] PUSH2 0x1ce3
    [9] ADD
    [11] PUSH1 0x22
    [12] ADD
    [14] PUSH1 0x20
    [15] SWAP1
    [16] SHL
    [21] PUSH4 0x09a90782
    [23] PUSH1 0x02
    [24] MUL
    [25] ADD
    [58] PUSH32 0xffffffffffffffffffffffffffffffffffffffffffffffffffffa7a7b3cfa9cc
    [59] NOT
    [60] XOR
    [67] PUSH6 0x666666abcdef
    [74] PUSH6 0x3a1e2d49f196
    [81] PUSH6 0x123456789abc
    [88] PUSH6 0x4d494b555859
    [89] XOR
    [90] XOR
    [91] MOD
    [92] STOP

    找到字节码,只要根据堆栈一步步走就行了

    1
    2
    3
    4
    5
    6
    7
    8
    9
    重点:
    1. SHL是把栈顶元素左移栈顶下面一个元素位
    就是假如栈是
    a
    b

    就是a<<b,a向左移b位

    2. MOD 第二个模第一个,但这题是第一个模第二个
    1
    2
    3
    最后答案:
    0x656330643373
    0x457a5f625937

    image-20241011183944943