教练我想学逆向
day1 5.5
easyre
拖进ida,shift+F12查找flag
IDA Pro:交互式反汇编器,是典型的递归下降反汇编器。
导航条:
蓝色 表示常规的指令函数
黑色 节与节之间的间隙
银白色 数据内容
粉色 表示外部导入符号
暗黄色 表示ida未识别的内容IDA主界面:
IDA View三种反汇编视图:文本视图、图表视图、路径视图
Hex View 十六进制窗口
Imports 导入函数窗口
Struceures 结构体窗口
Exports 导出函数窗口
Enums 枚举窗口
Strings 字符串窗口常用功能及快捷键:
空格键:切换文本视图与图表视图
ESC:返回上一个操作地址
G:搜索地址和符号
N:对符号进行重命名
冒号键:常规注释
分号键:可重复注释
Alt+M:添加标签
Ctrl+M:查看标签
Ctrl+S:查看段的信息
代码数据切换
C–>代码/D–>数据/A–>ascii字符串/U–>解析成未定义的内容
X:查看交叉应用
F5:查看伪代码
Alt+T:搜索文本
Alt+B:搜索十六进制导入jni.h分析jni库函数。
伪C代码窗口:
右键
comment-注释伪c代码。
copy to -assembly-把伪c代码复制到反汇编窗口的汇编代码。IDA可以修改so的hex来修改so,edit,然后edit-patchrogram,
在这里建议使用winhex来实现。
————————————————
版权声明:本文为CSDN博主「阿鲁巴110」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_30531517/java/article/details/82559428
reverse1
查找flag找到
aThisIsTheRight db ‘this is the right flag!’,0Ah,0
接下来寻找什么时候调用的
1 | loc_140011948: ; CODE XREF: sub_1400118C0+61j |
第一次:hello_world,错误。
1,所用的寄存器不同于32下的eax,ebx,ecx,edx,esi,edi,esp,ebp等,在64位下是rax,rbx,rcx,rdx,rsi,rdi,rsp,rbp,此外又增加了r8,r9,r10,r11,r12,r13,r14,r15等寄存器。但eax,ax,ah,al等依然可用,且增加了spl,bpl等8位寄存器调用,r8等也可以用r8d,r8w,r8b进行32位,16位,8位的调用。
2,函数调用参数传递不同于32下的stdcall规范,而采用fastcall,前四个参数为别放入rcx,rdx,r8,r9四个寄存器中,并在堆栈中留出4*8=32个字节的空间,多于四个的参数放入堆栈。
3,函数调用后,由调用者负责堆栈回收。
伪代码
1 | int sub_1400118C0() |
strncmp函数为字符串比较函数,字符串大小的比较是以ASCII 码表上的顺序来决定,此顺序亦为字符的值。其函数声明为int strncmp ( const char * str1, const char * str2, size_t n );功能是把 str1 和 str2 进行比较,最多比较前 n 个字节,若str1与str2的前n个字符相同,则返回0;若s1大于s2,则返回大于0的值;若s1 小于s2,则返回小于0的值。
111为o,48为0,把str2字符串的o变成0
lea —-取内存单元的有效知地址指令,只用于传送地道址。
ptr—–是临时的类型转换,相当于C语言中的强制类型转换
reserve2
1 | .data:0000000000601080 ; char flag |
flag:hacking_for_fun}
伪代码
1 | pid = fork(); |
105:i,114:r,49:1
试一试hack1ng_fo1_fun,起飞。
版本不兼容,后来点了以兼容模式运行
新年快乐
打开有点不对
UPX是一个著名的压缩壳,主要功能是压缩PE文件(比如exe,dll等文件),有时候也可能被病毒用于免杀.壳upx是一种保护程序。一般是EXE文件的一种外保护措施,主要用途 :
1、让正规文件被保护起来,不容易被修改和破解。
2、使文件压缩变小。
3、保护杀毒软件安装程序,使之不受病毒侵害。
4、木马,病毒的保护外壳,使之难以为攻破。
- 技术原理
对于可执行程序资源压缩,是保护文件的常用手段. 俗称加壳,加壳过的程序可以直接运行,但是不能查看源代码.要经过脱壳才可以查看源代码.
加壳:其实是利用特殊的算法,对EXE、DLL文件里的资源进行压缩。类似WINZIP的效果,只不过这个压缩之后的文件,可以独立运行,解压过程完全隐蔽,都在内存中完成。解压原理,是加壳工具在文件头里加了一段指令,告诉CPU,怎么才能解压自己。当加壳时,其实就是给可执行的文件加上个外衣。用户执行的只是这个外壳程序。当执行这个程序的时候这个壳就会把原来的程序在内存中解开,解开后,以后的就交给真正的程序。
加壳脱壳
程序为了反跟踪、被人跟踪调试、防止算法程序被别人静态分析就需要加壳。使用加壳软件加密代码和数据,就可以保护你程序数据的完整性,防止被程序修改和被窥视内幕。
https://blog.csdn.net/dubuqingfenggzy/java/article/details/16881607
happly new year!
day2 5.6
helloworld
apk文件。
APK是Android操作系统使用的一种应用程序包文件格式,基于 ZIP 文件格式。
我用jadx打开。
内涵软件
1 | v3 = (int)"DBAPP{49d3c93df25caad81232130f3d2ebfad}"; |
内涵
xor
我傻了,没注意64位。
伪代码,v7是输入且33位异或后==global
1 | printf("Input your flag:\n", 0LL); |
1 | aFKWO_ |
1 | a=['f', 'k',0xC,'w&O.@',0x11,'x',0xD,'Z;U',0x11,'p',0x19,'F',0x1F,'v"M#D',0x0E,'g',6,'h',0xF,'G2O',0] |
写的脚本有点问题,得到fg{QianQiuWanDai_YiTongJiangHu}O,应该是flag{QianQiuWanDai_YiTongJiangHu}
guessgame
1 | lea rax, aBjdS1mple_rev3 ; "BJD{S1mple_ReV3r5e_W1th_0D_0r_IDA}" |
签到题
reserve_3
输入flag
1 | sub_41132F("please enter the flag:", v4); |
sub_41132F输出,sub_411375输入。输入str经过sub_4110BE变成v1,变成Dest,dest里循环加j,0<j<len(dest),比较str2。
找str2
1 | push offset Str2 ; "e3nifIH9b_C@n@dH" |
1 | a="e3nifIH9b_C@n@dH" |
结果:e2lfbDB2ZV95b3V9,错误。忘了还有sub_4110BE。sub_411AB0
1 | if ( i == 1 ) |
1 | mov cl, byte ptr ds:aAbcdefghijklmn[edx] ; "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklm"... |
base64,emmmmmmmmm~~
day3 5.7
不一样的flag
看到提示我觉得不妙,会不会f5不能用了。
搜索flag。
call _puts应该是输出ptr,call _printf
1 | while ( 1 ) |
v3=1,v1–;
v3=2,v1++;
v3=3,v2–;
v3=4,v2++;
v5+5*v1+v2-41=35(‘#’)!=49(‘1’)
1 | char v0; // [sp+17h] [bp-35h]@1 |
1 | mov ebx, offset __data_start__ ; "*11110100001010000101111#" |
想多了,这是一个迷宫
1 | *1111 |
相当于二维数组,v1v2是坐标,1是可以走的,*头#尾。
刮开有奖
挂不了,生气。
1 | GetDlgItemTextA(hDlg, 1000, &String, 0xFFFF); |
看看sub_4010F0对v7-v17做了什么
1 | int __cdecl sub_4010F0(int a1, int a2, int a3) |
1 |
|
JSE aNH ng
淦,我的汇编就是一坨屎
去掉4*。
淦,我的保存没了。
string是flag,其中(v4, “ak1w”)(v5, “V1Ax”)是base64结果。
string = “UJWP1jMp”
day4 5.8
simpleRev
64位。
48-57:0-9
65-90:A-Z
97-122:a-z
Decry()里
1 | __int64 Decry() |
1 | char *__fastcall join(const char *a1, const char *a2) |
join就是字符串相连
主要变量:
v9 = 512969957736LL;==hadow
*(_QWORD *)src = 357761762382LL;==NDCLS
1
2
3
4
5
6
7
8
9
10
11 > int main(){
> long long a = 512969957736LL;
> char buffer[100];
> sprintf(buffer, "%lld", a);
> printf("%s\n", buffer);
> const char *b=(const char *)&a;
> cout<<b;
> return 0;
> }
>
>
text = join(key3, (const char *)&v9);
key3 ; “kills”
key1 ; “ADSFK”
过程:
key=key1+src
//text=killshadow,key=ADSFKNDCLS
key变小写
//keyt=adsfkndcls
str2变换
最后str2=test
str2[v3] = (v2 - 39 - key[v4++ % v6] + 97) % 26 + 97;
1 | key="adsfkndcls" |
java逆向解密
1 | package defpackage; |
(flag+@)^32==key
1 | KEY = [180, 136, 137, 147, 191, 137, 147, 191, 148, 136, 133, 191, 134, 140, 129, 135, 191, 65] |
芜湖!!!
findit
1 | public class MainActivity extends ActionBarActivity { |
b变y,y是flag
1 | for (int i2 = 0; i2 < 38; i2++) { |
凯撒,16位。我不管,爆破
pvkq{m164675262033l4m49lnp7p9mnk28k75}
8086
迷~~
1 | db 0B9h, 22h, 0, 8Dh, 1Eh, 2 dup(0), 8Bh, 0F9h, 4Fh, 80h |
c强制转换代码
1 | mov cx, 22h ; '"' |
1 | xor byte ptr [bx+di], 1Fh |
1 | a="]U[du~|t@{z@wj.}.~q@gjz{z@wzqW~/b;" |
rsa
public key:MDwwDQYJKoZIhvcNAQEBBQADKwAwKAIhAMAzLFxkrkcYL2wch21CM2kQVFpY9+7+./AvKr1rzQczdAgMBAAE=
http://tool.chacuo.net/cryptrsakeyparse
key长度: | 256 |
---|---|
模数: | C0332C5C64AE47182F6C1C876D42336910545A58F7EEFEFC0BCAAF5AF341CCDD |
指数: | 65537 (0x10001) |
86934482296048119190666062003494800588905656017203025617216654058378322103517
p=285960468890451637935629440372639283459
q=304008741604601924494328155975272418463
1 | openssl rsa -pubin -text -modulus -in pub.txt |
1 | #coding=utf-8 |
day5 5.9
CrackRTF
32位
1 | printf("pls input the first passwd(1): "); |
pw6位
1 | v5 = unknown_libname_1((char *)&pbData); |
1 | __int32 __cdecl unknown_libname_1(char *a1) |
pw>100000
1 | strcat((char *)&pbData, "@DBApp"); |
pbData=pw+”@DBApp”
v0=12
1 | sub_40100A(&pbData, v0, &String1); |
好像hash
去搜CryptCreateHash
sha1
1 | import hashlib |
跑了好久。。。。
pw=123321@DBApp
1 | if ( !_strcmpi(&String1, "6E32D0943418C2C33385BC35A1470250DD8923A9") ) |
1 | strcat(&String, (const char *)&pbData); |
string=pw2+”123321@DBApp”
CryptCreateHash里0x8003u是MD5,查不到。
会不会还是数字,爆破数字。
1 | import hashlib |
无
看后面吧
1 | hResInfo = FindResourceA(0, (LPCSTR)0x65, "AAA"); |
到这里,
sub_401019((BYTE *)&String, v1, &String1);
函数sub_401040(BYTE *pbData, DWORD dwDataLen, LPSTR lpString1)
1 | memset(&v4, 0xCCu, 0x4Cu); |
发现lpString进行了异或,a2为lpString首地址。
AAA是啥?我受不了了了,看wp。
{\rtf1\ansi\
。。。。。。。。。。。就这样吧,累了
day6 5.10
注册器
1 | char[] x = "dd2940c04462b4dd7c450528835cca15".toCharArray(); |
1 | x="dd2940c04462b4dd7c450528835cca15" |
luck_guy
1 | int __fastcall patch_me(int a1) |
a1最后一位为0
flag=f1+f2
1 | .text:0000000000400845 loc_400845: ; DATA XREF: .rodata:0000000000400BC8o |
f2=i c u g ` o f
1 | .text:00000000004008CA loc_4008CA: ; DATA XREF: .rodata:0000000000400BE0o |
1 | .text:0000000000400963 loc_400963: ; CODE XREF: get_flag+145j |
1 | .text:0000000000400912 loc_400912: ; CODE XREF: get_flag+19Cj |
CDQ 是一个让很多人感到困惑的指令。 这个指令把 EAX 的第 31 bit 复制到 EDX 的每一个 bit 上。 它大多出现在除法运算之前。它实际的作用只是把EDX的所有位都设成EAX最高位的值。也就是说,当EAX <80000000, EDX 为00000000;当EAX >= 80000000, EDX 则为FFFFFFFF。
我的f5和wp不一样,只能看汇编。头疼
1 | f2=[0x69,0x63,0x75,0x67,0x60,0x6f,0x66,0x7f] |
younger_drive
脱壳,32位。
v0是printf返回值,为1008
sub_41116D(&v5 == &v5, v0);
没看出什么
v1=12
v2=flag
1 | int __usercall sub_411E30@<eax>(char a1@<zf>, int result@<eax>) |
day7 5.11
pyre
pyc文件是python编译后的字节码文件。
在python中,输入一个模块相对来说是一个比较费时的事情,所以Python做了一些技巧,以便使输入模块更加快一些。一种方法是创建字节编译的文件,这些文件以.pyc作为扩展名。
当你在下次从别的程序输入这个模块的时候,.pyc文件是十分有用的——它会快得多,因为一部分输入模块所需的处理已经完成了。
在你import别的py文件时(也就是模块),那个py文件会被存一份pyc文件以加速下次装载。而主文件因为只需要装载一次就没有存pyc。
1 | print 'Welcome to Re World!' |
1 | input1='' |
相册
jadx打开。搜.com,有点弱智。
搜mail,有一个sendMailByJavaMail
1 | m.set_host(C2.MAILHOST); |
去c2看看
1 | public static final String CANCELNUMBER = "%23%2321%23"; |
1 | package com.net.cn; |
不知道这是什么。
一个Native Method就是一个Java调用非java代码的接口
“A native method is a Java method whose implementation is provided by non-java code.”
wp:Java中NativeMethod一般用于调用外部文件,再用IDA打libcore.so
easyRE
在sub_4009C6()里有
char v57[36]
if ( (unsigned __int8)(v57[i] ^ i) != *(&v21 + i)
写个代码看看
1 | b=a.replace(' ','') |
Info:The first four chars are flag
sub_400E44是base64
1 | if ( v9 == 39 ) |
10次,最后和off_6CC090比:
Vm0wd2VHUXhTWGhpUm1SWVYwZDRWVll3Wkc5WFJsbDNXa1pPVlUxV2NIcFhhMk0xVmpKS1NHVkdXbFpOYmtKVVZtcEtTMUl5VGtsaVJtUk9ZV3hhZVZadGVHdFRNVTVYVW01T2FGSnRVbGhhVjNoaFZWWmtWMXBFVWxSTmJFcElWbTAxVDJGV1NuTlhia0pXWWxob1dGUnJXbXRXTVZaeVdrWm9hVlpyV1hwV1IzaGhXVmRHVjFOdVVsWmlhMHBZV1ZSR1lWZEdVbFZTYlhSWFRWWndNRlZ0TVc5VWJGcFZWbXR3VjJKSFVYZFdha1pXWlZaT2NtRkhhRk5pVjJoWVYxZDBhMVV3TlhOalJscFlZbGhTY1ZsclduZGxiR1J5VmxSR1ZXSlZjRWhaTUZKaFZqSktWVkZZYUZkV1JWcFlWV3BHYTFkWFRrZFRiV3hvVFVoQ1dsWXhaRFJpTWtsM1RVaG9hbEpYYUhOVmJUVkRZekZhY1ZKcmRGTk5Wa3A2VjJ0U1ExWlhTbFpqUldoYVRVWndkbFpxUmtwbGJVWklZVVprYUdFeGNHOVhXSEJIWkRGS2RGSnJhR2hTYXpWdlZGVm9RMlJzV25STldHUlZUVlpXTlZadE5VOVdiVXBJVld4c1dtSllUWGhXTUZwell6RmFkRkpzVWxOaVNFSktWa1phVTFFeFduUlRhMlJxVWxad1YxWnRlRXRXTVZaSFVsUnNVVlZVTURrPQ==
https://bbs.pediy.com/thread-254172.htm
毛线啊神经病
不知道该怎么下手,看wp
1 | .data:00000000006CC0A0 byte_6CC0A0 db 40h ; DATA XREF: sub_400D35+95r |
1 | v7 = v4; |
102是f,103是g。byte_6CC0A0应该是flag,先把v7解出来
1 | key = '' |
https://www.cnblogs.com/Mayfly-nymph/p/11869959.html
脱壳
shift+f12字符串表
alt+t搜索字符串
f5伪代码
c强制转换代码
写py
day8 5.12
singin
1 | v8 = *MK_FP(__FS__, 40LL); |
v6=flag
sub_96A:v6变v7
1 | size_t __fastcall sub_96A(const char *a1, __int64 a2) |
byte_202010:16进制0-f
1 | db 30h, 31h, 32h, 33h, 34h, 35h, 36h, 37h, 38h, 39h, 61h 62h, 63h, 64h, 65h, 66h |
__gmpz_init_set_str:
GMP(The GNU Multiple Precision Arithmetic Library)又叫GNU多精度算术库,是一个提供了很多操作高精度的大整数,浮点数的运算的算术库,几乎没有什么精度方面的限制,功能丰富。
__gmpz_powm
gmp_powm()是PHP中的一个内置函数,用于计算以另一个GMP数模数模拟的两个GMP数的幂。(GNU Multiple Precision:For large number)
没有查到__gmpz_init_set_str具体干嘛的,应该是字符串转数字,gmpz_powm指数模。但是看到65537,rsa。
1 | import binascii |
原来有gmpy2.mpz
https://www.cnblogs.com/ESHLkangi/p/8576222.html
justre
you dian ji dong.
f5不出来,右键create f
sprintf(&String, aBjdDD2069a4579, 19999, 0);
BJD{1999902069a45792d233ac}
这个分值是为什么啊
day9 5.13
strngecpp
没有什么能阻止我获得flag,Orz。
1 | puts("Let me have a look at your computer..."); |
我觉得flag应该在:
1 | sub_1400113E3((__int64)&v10, (__int64)&unk_14001DE50); |
1 | int __fastcall sub_140014860(__int64 a1, __int64 a2) |
unk_14001DE50=10000000
0i64、16i64应该是64位整数。
-858993460是啥0xcccccccc
等等
1 | v15 = (unsigned __int64)&v11 ^ _security_cookie; |
_security_cookie=47936899621426:i64。好像没什么用。
找到一些奇怪的东西
1 | db 26h, 2Ch, 21h, 27h, 3Bh, 0Dh, 4, 75h, 68h, 34h, 28h |
1 | int sub_140013580() |
1 | signed __int64 __fastcall sub_140013890(signed int a1) |
dword_140021190通过sub_140013890变成了result
1 |
|
没有注意unsigned int和int的我像个弱智跑了好久
day10 5.14
又是元气满满的一天。
我最乐于助人了。
。。。
路由器固件dump文件,tplink我倒是看到了
binwalk -e 后有个.squashfs、7z压缩包、证书、空文件夹
Squashfs是一个只读格式的文件系统,具有超高压缩率,其压缩率最高可达34%。当系统启动后,会将文件系统保存在一个压缩过的文件系统的文件中,这个文件可以使用换回的形式挂载并对其中的文件进行访问,当进程需要某些文件时,仅将对应部分的压缩文件解压缩。
Squashfs文件系统常用的压缩格式有GZIP、LZMA、LZO、XZ(LZMA2),在路由器中被普遍采用。路由器的根文件系统通常会按照Squashfs文件系统常用压缩格式中的一种进行打包,形成一个完整的Squashfs文件系统,然后与路由器操作系统的内核一起形成更新固件。
然后呢。网上查
用unsquashfs命令解压
去ubuntu试试,不行。
查报错,。。。算了看wp
firmware-mod-kit工具的功能和binwalk工具的类似,实际上firmware-mod- kitfirm工具在功能上有调用binwalk工具提供的功能以及其他的固件解包工具的整合。下载firmware-mod-kit工具的链接进入到src目录下就能够看到firmware-mod-kit工具整合了那些固件提取和文件系统解压的工具。firmware-mod-kit工具的功能有固件文件的解包和打包,固件提取文件系统的解压和压缩,DD-WRT
网页的修改等,在每个整合的固件分析中工具的源码文件夹里都有相关的使用说明。
1 | sudo apt-get install git build-essential zlib1g-dev liblzma-dev python-magic |
gitclone慢没什么用,fq也是
1 | ./unsquashfs_all.sh 120200.squashfs |
day11 5.15
路漫漫其修远兮,吾将上下而求索!
re
好短,有壳吧。
脱壳。
搜了一波。
找到aInputYourFlag,
1 | sub_40F950((__int64)"input your flag:", 0LL, 0LL, 0LL, 0LL); |
1 | sub_40F950(-92); |
sub_4009ae里
1 | __int64 __fastcall sub_4009AE(__int64 a1) |
32位a1。
crackMe
32位。
1 | while ( 1 ) |
sub_4020E5==printf
sub_402194==scanf
sub_401000应该是判断用户存在。。是判断输入合法
1 | char __cdecl sub_401000(const char *a1) |
关键应该是sub_401830,它同时调用user和password
1 | bool __usercall sub_401830@<al>(signed int ebx0@<ebx>, int a1, const char *a2) |
sub_401470,传v17,使v14=43924
sub_401470里发现多个 if ( *(_BYTE *)a2 == ‘字符’ ),v17=dbappsec。
byte_416050在sub_401090(user)生成。不不不感谢https://www.cnblogs.com/basstorm/p/12662023.html。
绕过三个if反调试(__readfsdword)
1 | v = [0x2a,0xd7,0x92,0xe9,0x53,0xe2,0xc4,0xcd] |
可以说这是我目前为止遇到最难的,结合wp搞了一下午。反调试看了https://www.cnblogs.com/Crisczy/p/7575521.html,简单理解了一下。
day12 5.16
[GUET-2019]re
掐指一算有壳。
根据sub_4009AE写脚本。
这里可以用Z3约束器,也可以用515592000//9374400直接求a1。
1 | #!/usr/bin/python |
a1[6]没有。没想到爆破。1
day13 5.17
CSre
有壳。Eazfuscator.NET http://github.com/0xd4d/de4dot
什么乱七八糟的东西。
dnspy真好看,class3.method_0是sha1。
1 | public static string smethod_0(string string_0) |
314159
return
去掉39re
day14 5.18
[ACTF新生赛2020]easyre
upx脱壳
LOWORD()得到一个32bit数的低16bit
HIWORD()得到一个32bit数的高16bit
LOBYTE()得到一个16bit数最低(最右边)那个字节
HIBYTE()得到一个16bit数最高(最左边)那个字节
1 | __main(); |
1 | .data:00402000 __data_start__ db 7Eh ; DATA XREF: _main+ECr |
1 | data='~}|{zyxwvutsrqponmlkjihgfedcba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/.-,+*)(\'&%$# !"' |
起飞
[FlareOn4]login
1 |
|
1 | JavaScript fromCharCode() 方法将 Unicode 编码转为一个字符: |
1 | ''' |
一开始条件没写全。
day15 5.19
[BJDCTF2020]easy
没壳。
1 | int __cdecl main(int argc, const char **argv, const char **envp) |
找,感觉和时间有关。v5是当前时间tm类。
字符串什么的都没有,再找可疑的数据。
1 | int ques() |
#define SHIDWORD(x) (*((int32*)&(x)+1))
_ques里。为什么呢
修改eip地址跳转
HACKIT4FUN
wp上:函数窗口可以发现一个叫ques的未被调用的函数。
完全看找不找得到。
[GXYCTF2019]simple CPP
无壳64.
字符串里有,要绕过反调试
函数有个std::_Lockit::~_Lockit(void)没看出什么
1 | int sub_140001290() |
v3=flag^Dst
v3分割后满足一系列条件
flag条件:
(v20 | v19 | v25 & v26) == (~*(_QWORD *)v15 & v26 | 0xC00020130082C0Ci64)
v0==1
1 | v36=v26=v15[2] |
给爷爬!!!!
1 | #!/usr/bin/python |
1 | v15[3] = 842073600 |
1 | do |
1 | v15=[0]*4 |
We1l_D0n╡Cx_氤梖bu`Yo|@nho。emmm有点问题。
看过wp后发现v15[1]错了。我淦,把v15全换成xyzw,一个一个比。
我淦,每个wp v15[1]好像都不一样。
s=”3e3a460533286f00000000000000000008020717153e3013323106”
We1l_D0check_is_lgebra_am_i
比赛给了二部分e!P0or_a
我逆了一下,应该是0d44335b301b2c3e80,这样会10进制244722044838787956352转的话没有第一个0。
day16 5.20
xxor
应该在sub_400856里
1 | __int64 sub_400856() |
输入6个数字放在v3,v8还是v3,sub_400770(v8)==1
1 | signed __int64 __fastcall sub_400770(__int64 a1) |
上z3
1 | #!/usr/bin/python |
之后因为python整数范围原因位运算出错
1 |
|
day17 5.21
[BJDCTF2020]BJD hamburger competition
也许世上没有老八,也去人人都是老八。
ida打开后搜BJD没有。
unity是用C#开发。C#是微软公司发布的一种由C和C++衍生出来的面向对象的编程语言、运行于.NET Framework和.NET Core(完全开源,跨平台)之上的高级程序设计语言。
dnSpy 是一款针对 .NET 程序的逆向工程工具。
1 | if (ButtonSpawnFruit.Sha1(str) == "DD01903921EA24941C26A48F2CEC24E0BB0E8CC7") |
1001
b8c37e33defde51cf91e1e03e51657da
b8c37e33defde51cf91e
万万没想到是大写困扰了我。
day18 5.22
EPIC,永远的神
usualcrypt
32位
sub_403CF8是printf
sub_401080看着是base64,flag base64后传到v5
byte_40E0E4:
1 | .data:0040E0E4 byte_40E0E4 db 7Ah ; DATA XREF: _main+5Cr |
MXHz3TIgnxLxJhFAdtZn2fFk3lYCrtPC2l9
base64那应该改了
在sub_401000里
1 | signed int sub_401000() |
1 |
|
注意byte_40E0A0和byte_40E0AA是挨着的。[byte_40E0AA]就是[byte_40E0A0+10]
ABCDEFQRSTUVWXYPGHIJKLMNOZabcdefghijklmnopqrstuvwxyz0123456789+/
sub_401030里大小写转换
1 | if ( v2 < 97 || v2 > 122 ) // 97-122小写 |
所以flag,base64–byte_40E0AA–大小写
MXHz3TIgnxLxJhFAdtZn2fFk3lYCrtPC2l9
1 | import base64 |
真好flag{bAse64_2Y_a_Surprise}
为什么不对???
我的大小写好像有问题
1 | if f[i]>'A' and f[i]<'Z': #没= |
day19 5.23
[FlareOn4]IgniteMe
1 | void __noreturn start() |
sub_4010F0把flag放到byte_403078
1 | signed int sub_401050() |
v0是flag长度
v4:
1 | __int16 sub_401000() |
ROL4没查到,但v4可以调出来,为4
byte_403000里
1 | .data:00403000 byte_403000 db 0Dh |
1 | b= [0x0D,0x26,0x49,0x45,0x2A,0x17,0x78,0x44,0x2B,0x6C,0x5D,0x5E,0x45,0x12,0x2F,0x17,0x2B,0x44,0x6F,0x6E,0x56,0x09,0x5F,0x45,0x47,0x73,0x26,0x0A,0x0D,0x13,0x17,0x48, |
rome
32位无壳
falg16位,变换
1 | for ( i = 0; i <= 15; ++i ) |
后为
1 | v15 = 81; |
day20 5.24
gkctf的签到
day21 5.25
[19红帽]xx
无壳64
sub_1400011A0
code是qwertyuiopasdfghjklzxcvbnm1234567890
v3=len(code)=19
v4=sub_140001620(5) molloc(5)
v5 = *(_QWORD *)&::Code;
v6 = v4
v7 = 0;
v8 = v4
最下面的的比较
v24 = (_BYTE *)v19 - (_BYTE *)&v30;
if ( *((_BYTE *)&v30 + v25) != *((_BYTE *)&v30 + v25 + v24) )
所以&v30=&v19
异或
1 | for ( *((_BYTE *)v19 + 23) = *((_BYTE *)v18 + 21); v20 < v17; ++v21 ) |
sub_140001AB0里是xxtea
1 | *(v34 - 1) += ((v27 ^ v38) + (v29 ^ v18[v39])) ^ ((16 * v29 ^ (v38 >> 3)) + ((v29 >> 5) ^ 4 * v38)); |
和下面一样
1 | #define MX (((z>>5^y<<2) + (y>>3^z<<4)) ^ ((sum^y) + (key[(p&3)^e] ^ z))) |
知识点里xxtea是纯数字的,后来找到了https://blog.csdn.net/cserchen/article/details/8238641 python实现的字符串加解密。
1 | import binascii |
day22 5.27
[MRCTF2020]Transform
64无壳
简单的转换
1 | __int64 sub_401530() |
输入str,33位
byte_414040[i] = Str[dword_40F040[i]];
byte_414040[i] ^= LOBYTE(dword_40F040[i]);
LOBYTE()得到一个16bit数最低(最右边)那个字节,用&0xff就好。
1 | .data:000000000040F040 dword_40F040 dd 9, 0Ah, 0Fh, 17h, 7, 18h, 0Ch, 6, 1, 10h, 3, 11h, 20h |
1 | .data:000000000040F0E0 byte_40F0E0 db 67h, 79h, 7Bh, 7Fh, 75h, 2Bh, 3Ch, 52h, 53h, 79h, 57h |
1 | a='9, 0Ah, 0Fh, 17h, 7, 18h, 0Ch, 6, 1, 10h, 3, 11h, 20h,1Dh, 0Bh, 1Eh, 1Bh, 16h, 4, 0Dh, 13h, 14h, 15h, 2, 19h,5, 1Fh, 8, 12h, 1Ah, 1Ch, 0Eh, 0' |
[HDCTF2019]Maze
Maze迷宫,junk是废物垃圾,感觉是要找东西。
有壳
迷宫是
1 | *******+********* ****** **** ******* **F****** ************** |
后面写了7,所以要吗7要么10
1 | maze='*******+********* ****** **** ******* **F****** **************' |
1 | 70 |
下下左左左下左左下下右右右上
emmmm,flag{ssaaasaassdddw}
main函数奇怪数据强制转换
1 | .text:0040102C jnz short near ptr byte_40102F |
花指令是,由设计者特别构思,希望使反汇编的时候出错,让破解者无法清楚正确地反汇编程序的内容,迷失方向。经典的是,目标位置是另一条指令的中间,这样在反汇编的时候便会出现混乱。花指令有可能利用各种指令:jmp, call, ret的一些堆栈技巧,位置运算,等等。
1 | for ( i = 0; i <= 13; ++i ) |
od nop
保存文件。
洗衣服啊啊啊。
day23 5.29
[WUSTCTF2020]level1
有个output
1 | stream = fopen("flag", "r"); |
flag19位
1 | a='''222 |
观察一下数据,随便填一个数。
[安洵杯 2019]crackMe
Hook 技术又叫做钩子函数,在系统没有调用该函数之前,钩子程序就先捕获该消息,钩子函数先得到控制权,这时钩子函数既可以加工处理(改变)该函数的执行行为,还可以强制结束消息的传递。
比较
1 | if ( !j_strcmp(Str1, Str2) ) |
找到str、str1、str2
1 | Str db 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' |
1 | for ( i = 0; ; i += 2 ) |
str2奇偶交换
1 | Str1 = (char *)sub_41126C(byte_41A180); |
sub_41126C应该是base64。
我想着是flag base64后奇偶交换变成str2。然而并不是。再看看。
搜hooked
首先Str大小写转换
1 | for ( i = 0; ; ++i ) |
然后AddVectoredExceptionHandler,这是什么
向量化异常处理(Vectored Exception Handling)
向量化异常处理(VEH)是结构化异常处理的一个扩展,它在Windows XP中被引入。你可以使用AddVectoredExceptionHandler()函数添加一个向量化异常处理器,VEH的缺点是它只能用在WinXP及其以后的版本,因此需要在运行时检查AddVectoredExceptionHandler()函数是否存在。
要移除先前安装的异常处理器,可以使用RemoveVectoredExceptionHandler()函数。
VEH允许查看或处理应用程序中所有的异常。为了保持后向兼容,当程序中的某些部分发生SEH异常时,系统依次调用已安装的VEH处理器,直到它找到有用的SEH处理器。
VEH的一个优点是能够链接异常处理器(chain exception handlers),因此如果有人在你之前安装了向量化异常处理器,你仍然能截获这些异常。
当你需要像调试器一样监事所有的异常时,使用VEH是很合适的。问题是你需要决定哪个异常需要处理,哪个异常需要跳过。 In program’s code, some exceptions may be intentionally guarded by try{}except(){} construction, and handling such exceptions in VEH and not passing it to frame-based SEH handler, you may introduce bugs into application logics.
VEH目前没有被CrashRpt所使用。SetUnhandledExceptionFilter()更加适用,因为它是top-level SEH处理器。如果没有人处理异常,top-level SEH处理器就会被调用,并且你不用决定是否要处理这个异常。
翻译的。
1 | v6 = (int)AddVectoredExceptionHandler(0, (PVECTORED_EXCEPTION_HANDLER)Handler); |
Handler进去提示where_are_you_now后一个
sub_411172
1 | while ( v8 < 0x20 ) |
看了wp后知道sm4,。。。我好像学了
key就是where_are_you_now?
那个base64最后有一个return (a1 + 24) % 64;
1 | from pysm4 import * |
写的我吐了。各种格式啊什么东西的
其中pysm4,要看看他的使用
day24 5.30
eqution
看源代码解JSfuck
本来想http://ctf.ssleye.com/jsfuck.html解密的,但它的代码是部分部分加密的,一个一个找眼都瞎啦。去找代码。本来想搞个python爬虫,结果burpsuit用不了。
1 | <script> |
day25 5.31
[WUSTCTF2020]level2
有壳,命令行upx -d脱壳,不知道为什么图形界面不行。
wctf2020{Just_upx_-d}
好,这题目,好。
[FlareOn6]Overlong
无壳。找东西。
提示i nerver broke the encoding.
unk_402008有奇怪的数据,可能是flag
1 | v4 = sub_401160((int)Text, (int)&qiguai, 28u); |
28位。
text128位。
a3是28。
1 | for ( i = 0; ; ++i ) |
结合提示,去改a3.
1 | .text:004011C9 push 1Ch |
改成qiguai的长度,20b6-2008+1=af
在od改1c为af时改了很多次,发现如果要改成两位数字或一位数字+一位字母可以,而两位字母不可以,加0后如果:
push 0aa
1 | 00CC11C9 68 AA000000 PUSH 0AA |
push 0a1a
1 | 00CC11D3 68 1A0A0000 PUSH 0A1A |
push 0ffffffaf
1 | 00CC1205 6A AF PUSH -51 |
day26 6.1+6.2
[GWCTF 2019]re3
correct引用下面有奇怪的数据。
1 | void __noreturn sub_402126() |
flag32位
在Linux中,mprotect()函数可以用来修改一段指定内存区域的保护属性。
函数原型如下:
1
2
3
4 >
>
> int mprotect(const void *start, size_t len, int prot);
>
mprotect()函数把自start开始的、长度为len的内存区的保护属性修改为prot指定的值。
prot可以取以下几个值,并且可以用“|”将几个属性合起来使用:
1)PROT_READ:表示内存段内的内容可写;
2)PROT_WRITE:表示内存段内的内容可读;
3)PROT_EXEC:表示内存段中的内容可执行;
4)PROT_NONE:表示内存段中的内容根本没法访问。
这里7是和chmod一样可读可写可执行。
sub_402219还原idc脚本
1 |
|
auto声明变量
PatchByte(long addr, long val)设置虚拟地址addr处的一个字节值。
c强制转换,p生成函数。
主函数先进入sub_40207B。
1 | unsigned __int64 __fastcall sub_40207B(__int64 a1) |
__readfsqword从相对于 FS 段开头的偏移量指定的位置读取内存。
sub_401CF9是md5, 从 v6 = 0x67452301v7 = 0xEFCDAB89;v8 = 0x98BADCFE; v9 = 0x10325476;可以看出来。其中起到作用的是
1 | sub_401CF9(&unk_603120, 64LL, &v2); |
unk_603120是base64表,a1是unk_603170地址,结果就是base64表两次md5返回unk_603170。
base64表两次md5不行,可能改了什么,用od结果为cb8d493521b47a4cc1ae7e62229266ce。
看过feng_2016的wp发现sub_40207B中4个md5的关系
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 > import hashlib
> s1 = b'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
> s2 = b'\x00\x00\x00\x00\x96\x30\x07\x77\x2C\x61\x0E\xEE\xBA\x51\x09\x99\x19\xC4\x6D\x07'
> s3 = b'\x03\x05\x07\x0B\x0D\x11\x13\x17\x1D\x1F\x25\x29\x2B\x2F\x35\x3B\x3D\x43\x47\x49\x4F\x53\x59\x61\x65\x67\x6B\x6D\x71\x7F\x83\x89\x8B\x95\x97\x9D\xA3\xA7\xAD\xB3\xB5\xBF\xC1\xC5\xC7\xD3\xDF\xE3\xE5\xE9\xEF\xF1\xFB'
> s4 = b'\x78\xA4\x6A\xD7\x56\xB7\xC7\xE8\xDB\x70\x20\x24\xEE\xCE\xBD\xC1\xAF\x0F\x7C\xF5\x2A\xC6\x87\x47\x13\x46\x30\xA8\x01\x95\x46\xFD\xD8\x98\x80\x69\xAF\xF7\x44\x8B\xB1\x5B\xFF\xFF\xBE\xD7\x5C\x89\x22\x11\x90\x6B\x93\x71\x98\xFD\x8E\x43\x79\xA6\x21\x08\xB4\x49\x62\x25\x1E\xF6\x40\xB3\x40\xC0\x51\x5A\x5E\x26\xAA\xC7\xB6\xE9\x5D\x10\x2F\xD6\x53\x14\x44\x02\x81\xE6\xA1\xD8\xC8\xFB\xD3\xE7\xE6\xCD\xE1\x21\xD6\x07\x37\xC3\x87\x0D\xD5\xF4\xED\x14\x5A\x45\x05\xE9\xE3\xA9\xF8\xA3\xEF\xFC\xD9\x02\x6F\x67\x8A\x4C\x2A\x8D\x42\x39\xFA\xFF\x81\xF6\x71\x87\x22\x61\x9D\x6D\x0C\x38\xE5\xFD\x44\xEA\xBE\xA4\xA9\xCF\xDE\x4B\x60\x4B\xBB\xF6\x70\xBC\xBF\xBE\xC6\x7E\x9B\x28\xFA\x27\xA1\xEA\x85\x30\xEF\xD4\x05\x1D\x88\x04\x39\xD0\xD4\xD9\xE5\x99\xDB\xE6\xF8\x7C\xA2\x1F\x65\x56\xAC\xC4\x44\x22\x29\xF4\x97\xFF\x2A\x43\xA7\x23\x94\xAB\x39\xA0\x93\xFC\xC3\x59\x5B\x65\x92\xCC\x0C\x8F\x7D\xF4\xEF\xFF\xD1\x5D\x84\x85\x4F\x7E\xA8\x6F\xE0\xE6\x2C\xFE\x14\x43\x01\xA3\xA1\x11\x08\x4E\x82\x7E\x53\xF7\x35\xF2\x3A\xBD\xBB\xD2\xD7\x2A\x91\xD3\x86\xEB'
> s =''
> a = [s1,s2,s3,s4]
> for i in a:
> md5 = hashlib.md5()
> md5.update(i)
> s += md5.hexdigest()
> #以上步骤得到s,下面是我把它提取出来转化为二进制了
> s = b'\x78\x45\xf7\xea\xde\x89\x33\x8a\xda\xbf\xef\x89\xbd\x6e\x9a\x5b\xe8\x4f\xed\xef\x50\x67\xcf\x85\xf5\xe4\x7f\x4f\x4b\x59\x47\xa3\xc8\x38\xba\xe0\x2e\x07\xae\x0c\x27\x6d\xfb\x2e\x53\x30\x04\xc8\x7a\xc5\xfb\xac\x91\x1f\x3b\x36\x78\x41\xf8\xdc\xec\xc9\xdb\x46'
> md5 = hashlib.md5()
> md5.update(s)
> print(md5.hexdigest()
> #得到cb8d493521b47a4cc1ae7e62229266ce
> ————————————————
> 版权声明:本文为CSDN博主「feng_2016」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
> 原文链接:https://blog.csdn.net/feng_2016/article/details/106358117
>
接下来就是sub_402219
看到
1 | .rodata:00000000004023A0 ; char byte_4023A0[256] |
是AES的s盒。
看看aes加密后和谁比,解密flag。
1 | from Crypto.Cipher import AES |
day27 6.3
[GUET-CTF2019]number_game
1 | __int64 v3; // ST08_8 |
main函数里判断
- 首先对输入sub_4006D6
1 | if ( strlen(a1) == 10 ) |
输入v5 10位且47<v5[i]<=52,那就是01234
- 接下来sub_400758
1 | v6 = a3; |
v3赋值
- sub_400807
1 | __int64 __fastcall sub_400807(__int64 a1, __int64 a2) |
v7 dword_601080赋值v3[3]、[2]、[1]、[0](int 64)
- sub_400881((char *)&v7);
1 | __int64 __fastcall sub_400881(char *a1) |
将v7分别赋值
- sub_400917判断
1 | __int64 sub_400917() |
数独解出来v7=0,4,2,1,4,2,1,4,3,0
linux ida远程调试,我行你也行。(注意版本)
day28 6.5
[2019红帽杯]childRE
31位
1 | sub_140001080("%s", &v13); |
注意
1 | .rdata:0000000140003438 a55565653255552 db '55565653255552225565565555243466334653663544426565555525555222',0 |
1 | do |
相当于
1 | a[o[i]%23]=str78[i] |
1 | """ |
看UnDecorateSymbolName,看了百度看不懂,C++ 符号修饰和函数签名
1 | UnDecorateSymbolName(v2, outputString, 0x100u, 0); |
UnDecorateSymbolName 函数反修饰指定已修饰的 C++ 符号名。
1
2
3
4
5
6
7 > DWORD WINAPI UnDecorateSymbolName(
> _In_ PCTSTR DecoratedName,
> _Out_ PTSTR UnDecoratedName,
> _In_ DWORD UndecoratedLength,
> _In_ DWORD Flags
> );
>
DecoratedName [输入]
已修饰的 C++ 符号名。此名称能以始终为问号 (?) 的首字符鉴别。
UnDecoratedName [输出]
指向字符串缓冲区的指针,该缓冲区接收未修饰的名字。
UndecoratedLength [输入]
UnDecoratedName 缓冲区的大小,为字符数。
Flags [输入]
用于反修饰已修饰名称的方式的选项。此参数能为零或更多个下列值
现在要v2的值,C++编译时函数名修饰约定规则(很具体),MFC提供的宏,extern “C”的作用
?My_Aut0_PWN@R0Pxx@@AAEPADPAE
用x64dbg调试
写脚本把字符串转一下得到flag,再md5.
看别人的wp中UnDecorateSymbolName可以这样,其中注意是char* My_Aut0_PWN不是char My_Aut0_PWN
1 |
|
day29 6.6
[MRCTF2020]Xor
ida编码格式改utf-8,一开始英文乱码。
sub_401020输出
sub_401050输入
byte_4212C0输入,27位
比较函数
1 | v1 = 0; |
((unsigned int8)v1 ^ (unsigned int8)byte_4212C0[v1]) != byte_41EA08[v1]
byte_41EA08是
1 | .rdata:0041EA08 byte_41EA08 db 'M' |
1 | s="MSAWB~FXZ:J:`tQJ\"N@ bpdd}8g" |
findKey
全p一下,flag字符串位置
1 | void __usercall __noreturn sub_401A37(int a1@<ebp>) |
看一下sub_401A37的调用,。。。无。有点问题。
看了wp才知道问题所在,两个push,nop一个,p一下。
1 | .text:00401918 push offset byte_428C54 |
- 1
1 | strcpy(&v21, "0kk`d1a`55k222k2a776jbfgd`06cjjb"); |
1 | //sub_401005--异或 |
1 | v21="0kk`d1a`55k222k2a776jbfgd`06cjjb" |
- 2
1 | _strcmpi((const char *)&String1, &v21) |
v21是c8837b23ff8aaa8a2dde915473ce0991,找string1是什么
发现string1结构CryptCreateHash。在附件找到0x8003u是md5
1 | CryptCreateHash(phProv, 0x8003u, 0, 0, &phHash) |
解密123321
- 3
最后有一个
1 | memcpy(&v16, &unk_423030, 0x32u); |
v25是string1未加密的,就是123321
1 | a=[0x57 ,0x5E ,0x52 ,0x54,0x49 ,0x5F,1,0x6D ,0x69,0x46 ,2,0x6E,0x5F,2,0x6C ,0x57 ,0x5B,0x54 ,0x4C] |
day30 6.9
打了学校的awd,专注拿flag,没有搅屎,以至于后期flag少了很多。还是没什么经验。
[WUSTCTF2020]level3
看字符串是变换的base64
这是加密后的flag
1 | d2G0ZjLwHjS7DmOzZAY0X2lzX3CoZV9zdNOydO9vZl9yZXZlcnGlfD== |
进入base64_encode查看
base64_table是正常的
emmm,再找找。肯定对base64_table做了变换,x一下找到
1 | __int64 O_OLookAtYou() |
换位置。
1 |
|
1 | import base64 |
不知道为什么python报错’str’ object has no attribute ‘b64decode’
day31 6.23
放假了,emm。好久没刷题了
[MRCTF2020]hello_world_go
打开看就很奇怪,字符串一堆让人眼花缭乱。
其中runtime_staticbytes是包含ascii表,看引用runtime_intstring。emm
看main函数里unk_4D3C58找到flag
day32 7.1
[FlareOn5]Minesweeper Championship Registration
扫雷锦标赛注册,emm
Welcome to the Fifth Annual Flare-On Challenge! The Minesweeper World Championship is coming soon and we found the registration app. You weren’t officially invited but if you can figure out what the code is you can probably get in anyway. Good luck!
Hint:本题解出相应字符串后请用flag{}包裹,形如:flag{123456@flare-on.com}
java的逆向,百度一下下一个jd-gui,官网打不开,去github
[网鼎杯 2020 青龙组]singal
无壳32位,输入字符串
read
函数限定15位
1 | int __cdecl main(int argc, const char **argv, const char **envp) |
主要就是vm_operad
1 | int __cdecl vm_operad(int *a1, int a2) |
unk_403040
第一个数就是10,执行了read
我淦,我的保存呢,只有未完成的了
1 |
|
https://blog.csdn.net/Breeze_CAT/article/details/106139253
1 | import angr |
day33 7.2
[MRCTF2020]PixelShooter
像素射手
安卓逆向
内容入口 | 含义解释 |
---|---|
AndroidManifest.xml | 二进制xml文件,提供设备运行应用程序所需的各种信息 |
classes.dex | 以dex格式编译的应用程序代码 |
resources.arsc | 包含预编译应用程序资源的二进制XML文件 |
res/ | 此文件夹中包含未编译到resources.arsc文件中的资源 |
assets/ | 此文件夹包含应用程序的原始资源,由AssetManager提供对这些资产文件的访问 |
META-INF/ | 它包含MANIFEST.MF文件,该文件存储有关JAR内容的元数据。APK签名也存储在此文件夹中 |
lib/ | 此文件夹包含已编译的代码,例如本地代码库 |
进去打飞机。
unity召唤dnspy,找到Assembly-CSharp,gameover
[RoarCTF2019]polyre
1 | [root@lalala re]# ./attachment |
ida里看一下,wdf
看wp知道是控制流平坦化,angr环境配半天,docker国内镜像没有,慢的一p
day34 7.3
[GKCTF2020]Chelly’s identity
1 | hi.Are you know of chelly? |
题目错了
flag是16位,可以通过ida看出来或手动试试
- 对输入(v43)动手脚
1 | for ( i = 0; ; ++i ) |
sub_631771
和 sub_6311D6
最后都调用了 sub_6314DD
先看判断sub_411852
sub_4112F8
应该是开辟空间的
day35 7.8
challenge1
1 | v6 = "x2dtJEOmyjacxDemx2eczT5cVS9fVUGvWTuZWjuexjRqy24rV29q"; |
sub_401260
很明显是一个base64,换表
1 | import base64 |
[Zer0pts2020]easy strcmp
main函数很简单,就是输入strcmp zer0pts{*******CENSORED*******\}
找到对输入操作的函数
1 | __int64 __fastcall sub_6EA(__int64 a1, __int64 a2) |
1 | qword_201060 dq 0, 410A4335494A0942h, 0B0EF2F50BE619F0h, 4F0A3A064A35282Bh |
第一个for循环获得输入位数,第二个for循环将输入分为8位一组减去一个数,所以zer0pts{-0还是zer0pts{。
写脚本
1 | import binascii |
一开始没有考虑大小端问题,中间CENSORED出错了。
day36 7.13
[安洵杯 2019]game
控制流平坦化,恶心
[ACTF新生赛2020]Universe_final_answer
判断语句
1 | if ( sub_860(&v5) ) |
函数sub_860
一大堆判断
1 | if ( -85 * v9 + 58 * v8 + 97 * v6 + v7 + -45 * v5 + 84 * v4 + 95 * v2 - 20 * v1 + 12 * v3 == 12613 ) |
z3求一下
1 | #!/usr/bin/python |
注意位置,这是一半:F0uRT_y7w@
淦,里面还有6、7位置
第二部分就是9异或字符串
再将数字变为字符串
1 | f1='F0uRTy_7w@' |
day37 7.31
[ACTF新生赛2020]Oruga
tell me the flag
1 | printf("Tell me the flag:", 0LL); |
其中if ( !strcmp((const char *)&v4 + 4, s2) )
就是判断flag格式是否为actf{
,然后进入sub_78A
。
看到
1 | if ( *(_BYTE *)(v3 + a1) != 'W' || v4 == -16 ) |
这样子就感觉是个迷宫,W上,E右,M下,J左。把byte_201020数据提取,一行16个。奇怪的是一组判断
1 | while ( !byte_201020[v2] ) |
前4个if应该是判断出界,后面v2+=v4就是当byte_201020[v2]==0时可以继续走。
走到21h结束
1 |
|
flag{MEWEMEWJMEWJM}
day38 8.1
[FlareOn5]Ultimate Minesweeper
You hacked your way into the Minesweeper Championship, good job. Now its time to compete. Here is the Ultimate Minesweeper binary. Beat it, win the championship, and we’ll move you on to greater challenges.
Hint:本题解出相应字符串后请用flag{}包裹,形如:flag{123456@flare-on.com}
900个格子,897个雷,好玩。这是net程序,用dnspy打开,这个题目应该是让我们去修改雷个数或什么东西。
getkey
里有个数组很像flag
1 | private string GetKey(List<uint> revealedCells) |
但random.NextBytes(array);
有随机数,放弃。
AllocateMemory
是生成雷区
1 | private void AllocateMemory(MineField mf) |
将if (this.VALLOC_TYPES.Contains(this.DeriveVallocType(r, c)))
改成if ((r == 1U && c == 1U) || (r == 1U && c == 2U) || (r == 1U && c == 3U))
后安全区改为(1.1)(1.2)(1.3)但最后输出flag错误,这是因为random.NextBytes(array);
随机数用到了安全坐标。
再看getkey
的引用
1 | private void SquareRevealedCallback(uint column, uint row) |
很明显两个判断,第一个是雷。先改程序,把第一个Thread.Sleep(1000);new FailurePopup().ShowDialog();Application.Exit();
删了就可以找三个点。
但是这样还是很麻烦,需要一个一个点,根据Harmonica_11可以在AllocateMemory添加
1 | Console.Write(r); |
[安洵杯 2019]game
emm,再搞一次
主要函数
1 | while ( 1 ) |
进入blank_num
,理清流程
1 | v6 = 0; |
其实到最后就是if ( !(*a1)[9 * v8 + v7] )
然后返回了数独数组中0的个数,动调后发现返回值为40。
trace((__int64)sudoku, v5, v4);
和 check((int (*)[9])sudoku);
感觉没用,一来它们的返回值没有用,二没有改变sudoku,pass。(这个不清楚)
check1
1 | while ( 1 ) |
所以check1将flag先前后互换、两位互换,最后a1[v12] = (a1[v12] & 0xF3 | ~a1[v12] & 0xC) - 20;
check3
没什么用,只有里面check2
有用
1 | s = a1; |
流程:dog3=flag-48==sudoku
现在需要知道前后的sudoku,动调。不知道为什么dd变db了
1 | sudoku = [1, 4, 5, 3, 2, 7, 6, 9, 8, 8, 3, 9, 6, 5, 4, 1, 2, 7, 6, 7, 2, 8, 1, 9, 5, 4, 3, 4, 9, 6, 1, 8, 5, 3, 7, 2, 2, 1, 8, 4, 7, 3, 9, 5, 6, 7, 5, 3, 2, 9, 6, 4, 8, 1, 3, 6, 7, 5, 4, 2, 8, 1, 9, 9, 8, 4, 7, 6, 1, 2, 3, 5, 5, 2, 1, 9, 3, 8, 7, 6, 4] |
知识点
NET语言的全称应该是ASP.NET,是微软新推出的一种编程框架理论或者说是一种编程标准,它可以通过微软出品的Visual Studio 开发工具进行项目开发,应用于网站类的开发一般使用C#语言进行编写,应用程序类一般使用VB进行编写。
unity是用C#开发,被编译到了 Assembly-CSharp.dll
C#是微软公司发布的一种由C和C++衍生出来的面向对象的编程语言、运行于.NET Framework和.NET Core(完全开源,跨平台)之上的高级程序设计语言。
dnSpy 是一款针对 .NET 程序的逆向工程工具。
lo、hiword
LOWORD()得到一个32bit数的低16bit
HIWORD()得到一个32bit数的高16bit
LOBYTE()得到一个16bit数最低(最右边)那个字节
HIBYTE()得到一个16bit数最高(最左边)那个字节
IDA逆向常用宏定义
1 | /* |
Tea/XTea/XXTea
Tea
在密码学中,微型加密算法(Tiny Encryption Algorithm,TEA)是一种易于描述和执行的块密码,通常只需要很少的代码就可实现。其设计者是剑桥大学计算机实验室的大卫 · 惠勒与罗杰 · 尼达姆。
参考代码:
1 |
|
XTea
XTEA是TEA的升级版,增加了更多的密钥表,移位和异或操作等等,设计者是Roger Needham, David Wheeler
1 |
|
XXTea
XXTEA,又称Corrected Block TEA,是XTEA的升级版,设计者是Roger Needham, David Wheeler
1 |
|
1 | ############################################################ |
原文链接:https://blog.csdn.net/gsls200808/java/article/details/48243019
write/readfile
1 | BOOL WriteFile( |
1 | BOOL ReadFile( |
AEH
AddVectoredExceptionHandler function
Registers a vectored exception handler.
- Syntax
1 | PVOID AddVectoredExceptionHandler( |
- Return value
If the function succeeds, the return value is a handle to the exception handler.
If the function fails, the return value is NULL.
pysm4
pysm4是国密SM4算法的Python实现, 提供了encrypt
、 decrypt
、 encrypt_ecb
、 decrypt_ecb
、 encrypt_cbc
、 decrypt_cbc
等函数用于加密解密, 用法如下:
1. encrypt
和decrypt
1 | > from pysm4 import encrypt, decrypt |
2. encrypt_ecb
和decrypt_ecb
1 | > from pysm4 import encrypt_ecb, decrypt_ecb |
3. encrypt_cbc
和decrypt_cbc
1 | > from pysm4 import encrypt_cbc, decrypt_cbc |
idc
附件
CryptCreateHash:ALG_ID
Identifier | Value | Description |
---|---|---|
CALG_3DES | 0x00006603 | Triple DES encryption algorithm. |
CALG_3DES_112 | 0x00006609 | Two-key triple DES encryption with effective key length equal to 112 bits. |
CALG_AES | 0x00006611 | Advanced Encryption Standard (AES). This algorithm is supported by the Microsoft AES Cryptographic Provider. |
CALG_AES_128 | 0x0000660e | 128 bit AES. This algorithm is supported by the Microsoft AES Cryptographic Provider. |
CALG_AES_192 | 0x0000660f | 192 bit AES. This algorithm is supported by the Microsoft AES Cryptographic Provider. |
CALG_AES_256 | 0x00006610 | 256 bit AES. This algorithm is supported by the Microsoft AES Cryptographic Provider. |
CALG_AGREEDKEY_ANY | 0x0000aa03 | Temporary algorithm identifier for handles of Diffie-Hellman–agreed keys. |
CALG_CYLINK_MEK | 0x0000660c | An algorithm to create a 40-bit DES key that has parity bits and zeroed key bits to make its key length 64 bits. This algorithm is supported by the Microsoft Base Cryptographic Provider. |
CALG_DES | 0x00006601 | DES encryption algorithm. |
CALG_DESX | 0x00006604 | DESX encryption algorithm. |
CALG_DH_EPHEM | 0x0000aa02 | Diffie-Hellman ephemeral key exchange algorithm. |
CALG_DH_SF | 0x0000aa01 | Diffie-Hellman store and forward key exchange algorithm. |
CALG_DSS_SIGN | 0x00002200 | DSA public key signature algorithm. |
CALG_ECDH | 0x0000aa05 | Elliptic curve Diffie-Hellman key exchange algorithm.[!Note] This algorithm is supported only through Cryptography API: Next Generation. Windows Server 2003 and Windows XP: This algorithm is not supported. |
CALG_ECDH_EPHEM | 0x0000ae06 | Ephemeral elliptic curve Diffie-Hellman key exchange algorithm.[!Note] This algorithm is supported only through Cryptography API: Next Generation. Windows Server 2003 and Windows XP: This algorithm is not supported. |
CALG_ECDSA | 0x00002203 | Elliptic curve digital signature algorithm.[!Note] This algorithm is supported only through Cryptography API: Next Generation. Windows Server 2003 and Windows XP: This algorithm is not supported. |
CALG_ECMQV | 0x0000a001 | Elliptic curve Menezes, Qu, and Vanstone (MQV) key exchange algorithm. This algorithm is not supported. |
CALG_HASH_REPLACE_OWF | 0x0000800b | One way function hashing algorithm. |
CALG_HUGHES_MD5 | 0x0000a003 | Hughes MD5 hashing algorithm. |
CALG_HMAC | 0x00008009 | HMAC keyed hash algorithm. This algorithm is supported by the Microsoft Base Cryptographic Provider. |
CALG_KEA_KEYX | 0x0000aa04 | KEA key exchange algorithm (FORTEZZA). This algorithm is not supported. |
CALG_MAC | 0x00008005 | MAC keyed hash algorithm. This algorithm is supported by the Microsoft Base Cryptographic Provider. |
CALG_MD2 | 0x00008001 | MD2 hashing algorithm. This algorithm is supported by the Microsoft Base Cryptographic Provider. |
CALG_MD4 | 0x00008002 | MD4 hashing algorithm. |
CALG_MD5 | 0x00008003 | MD5 hashing algorithm. This algorithm is supported by the Microsoft Base Cryptographic Provider. |
CALG_NO_SIGN | 0x00002000 | No signature algorithm. |
CALG_OID_INFO_CNG_ONLY | 0xffffffff | The algorithm is only implemented in CNG. The macro, IS_SPECIAL_OID_INFO_ALGID, can be used to determine whether a cryptography algorithm is only supported by using the CNG functions. |
CALG_OID_INFO_PARAMETERS | 0xfffffffe | The algorithm is defined in the encoded parameters. The algorithm is only supported by using CNG. The macro, IS_SPECIAL_OID_INFO_ALGID, can be used to determine whether a cryptography algorithm is only supported by using the CNG functions. |
CALG_PCT1_MASTER | 0x00004c04 | Used by the Schannel.dll operations system. This ALG_ID should not be used by applications. |
CALG_RC2 | 0x00006602 | RC2 block encryption algorithm. This algorithm is supported by the Microsoft Base Cryptographic Provider. |
CALG_RC4 | 0x00006801 | RC4 stream encryption algorithm. This algorithm is supported by the Microsoft Base Cryptographic Provider. |
CALG_RC5 | 0x0000660d | RC5 block encryption algorithm. |
CALG_RSA_KEYX | 0x0000a400 | RSA public key exchange algorithm. This algorithm is supported by the Microsoft Base Cryptographic Provider. |
CALG_RSA_SIGN | 0x00002400 | RSA public key signature algorithm. This algorithm is supported by the Microsoft Base Cryptographic Provider. |
CALG_SCHANNEL_ENC_KEY | 0x00004c07 | Used by the Schannel.dll operations system. This ALG_ID should not be used by applications. |
CALG_SCHANNEL_MAC_KEY | 0x00004c03 | Used by the Schannel.dll operations system. This ALG_ID should not be used by applications. |
CALG_SCHANNEL_MASTER_HASH | 0x00004c02 | Used by the Schannel.dll operations system. This ALG_ID should not be used by applications. |
CALG_SEAL | 0x00006802 | SEAL encryption algorithm. This algorithm is not supported. |
CALG_SHA | 0x00008004 | SHA hashing algorithm. This algorithm is supported by the Microsoft Base Cryptographic Provider. |
CALG_SHA1 | 0x00008004 | Same as CALG_SHA. This algorithm is supported by the Microsoft Base Cryptographic Provider. |
CALG_SHA_256 | 0x0000800c | 256 bit SHA hashing algorithm. This algorithm is supported by Microsoft Enhanced RSA and AES Cryptographic Provider..Windows XP with SP3: This algorithm is supported by the Microsoft Enhanced RSA and AES Cryptographic Provider (Prototype). Windows XP with SP2, Windows XP with SP1 and Windows XP: This algorithm is not supported. |
CALG_SHA_384 | 0x0000800d | 384 bit SHA hashing algorithm. This algorithm is supported by Microsoft Enhanced RSA and AES Cryptographic Provider.Windows XP with SP3: This algorithm is supported by the Microsoft Enhanced RSA and AES Cryptographic Provider (Prototype). Windows XP with SP2, Windows XP with SP1 and Windows XP: This algorithm is not supported. |
CALG_SHA_512 | 0x0000800e | 512 bit SHA hashing algorithm. This algorithm is supported by Microsoft Enhanced RSA and AES Cryptographic Provider.Windows XP with SP3: This algorithm is supported by the Microsoft Enhanced RSA and AES Cryptographic Provider (Prototype). Windows XP with SP2, Windows XP with SP1 and Windows XP: This algorithm is not supported. |
CALG_SKIPJACK | 0x0000660a | Skipjack block encryption algorithm (FORTEZZA). This algorithm is not supported. |
CALG_SSL2_MASTER | 0x00004c05 | Used by the Schannel.dll operations system. This ALG_ID should not be used by applications. |
CALG_SSL3_MASTER | 0x00004c01 | Used by the Schannel.dll operations system. This ALG_ID should not be used by applications. |
CALG_SSL3_SHAMD5 | 0x00008008 | Used by the Schannel.dll operations system. This ALG_ID should not be used by applications. |
CALG_TEK | 0x0000660b | TEK (FORTEZZA). This algorithm is not supported. |
CALG_TLS1_MASTER | 0x00004c06 | Used by the Schannel.dll operations system. This ALG_ID should not be used by applications. |
CALG_TLS1PRF | 0x0000800a | Used by the Schannel.dll operations system. This ALG_ID should not be used by applications. |