复现一下2022TAMUctf
Crypto
Take a Byte (rsa爆破m)
1 | N = 142340601329766635770777206868142025827135648303906321521767950463359821968347786484195570468286189226989358219855587259388045702266863705647272136227951246915219010211812867670881597286343297521061070264928021561647069809027686627213745350820280726089198348218787227379658142796612755695608708166251723918573 |
给我们的是是很多段经过加密后的数字,刚开始还往共模啥啥啥的地方想,后面想通了……
单个字符加密,m很小,所以可以直接爆破,代码:
1 | from Crypto.Util.number import* |
reverse
Covfefe
题目给出了.class文件,在网上下载jad,然后在当前目录中新建class和src文件夹,class文件夹中存放反汇编文件,运行以下代码后,src文件夹会自动生成逆向后的文件。
1 | jad -o -r -s java -d src class/**/*.class |
鼠标右键查看源代码
1 | // Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov. |
写点python小代码:
1 | ai = [0]*35 |
Existing Tooling (elf动调)
文件在运行过程中就会产生flag,并且最后会输出长度。
动调obj数组即可
shift+e提取数据
1 | gigem{im_curious_did_you_statically_or_dynamically_reverse_ping_addison} |
Redo1 (C指针逆向)
幸好前几天刚把C指针学完,不然就凉透了。
1 |
|
argc是传入参数的个数,argv[]是传入的参数,参数长度需要等于34
被定义成char * 类型的指针flag,指向了从int * 类型转换成a数组,那么当flag指针++的时候,应当是+1(char类型的数据宽度为1),所以px遍历a数组,则是按照0x67->0x69->0x67-0x65的顺序遍历。
比赛的时候,题目都没看全,就试了试,flag就出来了,去掉数组a中的0x00000000,就可以了
1 |
|
Redo2 (gcc生成汇编代码)
给我们整上了Intel的汇编,这题真的困扰了我很久,我头铁,还想着手动还原的,还画了堆栈图,没往生成汇编代码这块想……
1 | .intel_syntax noprefix |
需要在头部加上At&t 语法,然后运行下面的代码:
1 | gcc -g -m32 -c redo2.s -o redo2 |
wp上使用的是Binary Ninja,我使用的是逆向界的瑞士军刀——IDA
注意输入的时候,v4所有元素都被减去了49,所以写脚本的时候需要加上:
1 | int __cdecl main(int argc, const char **argv, const char **envp) |
脚本:
1 | v4 = [0]*29 |