-
-
[原创]BUUCTF逆向题:[FlareOn4]IgniteMe
-
发表于: 2022-3-25 00:21 5834
-
1.基本信息探查:
1.EXEinfo:
32位,无壳
2.运行一下:
2.IDA分析:
1.主函数分析:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | void __noreturn start() { DWORD NumberOfBytesWritten; / / [esp + 0h ] [ebp - 4h ] BYREF NumberOfBytesWritten = 0 ; hFile = GetStdHandle( 0xFFFFFFF6 ); dword_403074 = GetStdHandle( 0xFFFFFFF5 ); WriteFile(dword_403074, aG1v3M3T3hFl4g, 0x13u , &NumberOfBytesWritten, 0 ); / / 输出“G1v3 m3 t3h fl4g:” sub_4010F0(NumberOfBytesWritten); if ( sub_401050() ) WriteFile(dword_403074, aG00dJ0b, 0xAu , &NumberOfBytesWritten, 0 ); / / 输出“G00d j0b!” else WriteFile(dword_403074, aN0tT00H0tRWe7r, 0x24u , &NumberOfBytesWritten, 0 ); / / 输出“N0t t00 h0t R we? 7ry 4ga1nz plzzz!” ExitProcess( 0 ); } |
WriteFile其实就相当于输出语句,那么我们要分析的地方就是两个函数,一个是sub_4010F0
,一个是sub_401050
2.sub_4010F0()函数分析:
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 | int sub_4010F0() { unsigned int v0; / / eax char Buffer [ 260 ]; / / [esp + 0h ] [ebp - 110h ] BYREF DWORD NumberOfBytesRead; / / [esp + 104h ] [ebp - Ch] BYREF unsigned int i; / / [esp + 108h ] [ebp - 8h ] char v5; / / [esp + 10Fh ] [ebp - 1h ] v5 = 0 ; for ( i = 0 ; i < 0x104 ; + + i ) Buffer [i] = 0 ; / / 初始化 Buffer 变量 ReadFile(hFile, Buffer , 0x104u , &NumberOfBytesRead, 0 ); / / 读取字符串,并放入 Buffer 变量 for ( i = 0 ; ; + + i ) / / 循环遍历 Buffer { v0 = sub_401020(( int ) Buffer ); / / 这个函数相当于Strlen if ( i > = v0 ) break ; v5 = Buffer [i]; / / v5存的是 Buffer 的i偏移的值 if ( v5 ! = 10 && v5 ! = 13 ) / / v5不等于换行或回车 { if ( v5 ) byte_403078[i] = v5; / / 最终存在了byte_403078的地址里 } } return 1 ; } |
这个函数就是去除掉输入字串的换行和回车
3.sub_401050()函数分析:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | int sub_401050() { int v1; / / [esp + 0h ] [ebp - Ch] int i; / / [esp + 4h ] [ebp - 8h ] unsigned int j; / / [esp + 4h ] [ebp - 8h ] char v4; / / [esp + Bh] [ebp - 1h ] v1 = sub_401020(( int )byte_403078); v4 = sub_401000(); for ( i = v1 - 1 ; i > = 0 ; - - i ) { byte_403180[i] = v4 ^ byte_403078[i]; v4 = byte_403078[i]; } for ( j = 0 ; j < 0x27 ; + + j ) { if ( byte_403180[j] ! = (unsigned __int8)byte_403000[j] ) return 0 ; } return 1 ; } |
这个函数就是加密函数了,咱一条一条语句来:
- 先看v1的赋值sub_401020()函数之前就分析过相当于strlen,所以v1存放输入字串的串长
- v4调用函数做了个循环右移的运算这里图方便直接动调查看里面的值,值为4
- 注意这里的循环是从后往前取值
- 接着就是异或操作,这里注意之后v4的值就变成了输入字串的i偏移的值
- 下面这个for就是循环判断异或后的值是否与byte_403000的值相等了
3.EXP编写:
先提取处byte_403000处的值
1 | 0D2649452A1778442B6C5D5E45122F172B446F6E56095F454773260A0D1317484201404D0C026900 |
最后exp为:
1 2 3 4 5 6 7 8 9 | rflag = [ 0x0D , 0x26 , 0x49 , 0x45 , 0x2A , 0x17 , 0x78 , 0x44 , 0x2B , 0x6C , 0x5D , 0x5E , 0x45 , 0x12 , 0x2F , 0x17 , 0x2B , 0x44 , 0x6F , 0x6E , 0x56 , 0x9 , 0x5F , 0x45 , 0x47 , 0x73 , 0x26 , 0x0A , 0x0D , 0x13 , 0x17 , 0x48 , 0x42 , 0x1 , 0x40 , 0x4D , 0x0C , 0x2 , 0x69 , 0x0 ] flag = "" rflag_len = len (rflag) - 1 for i in range ( len (rflag)): if i = = 0 : rflag[rflag_len - i] = rflag[rflag_len - i] ^ 0x4 rflag[rflag_len - i - 1 ] = rflag[rflag_len - i - 1 ] ^ rflag[rflag_len - i] flag + = chr (rflag[rflag_len - i]) print (flag[:: - 1 ]) |
flag{R_y0u_H0t_3n0ugH_t0_1gn1t3@flare-on.com}
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
最后于 2022-3-27 16:12
被宇宙大魔王编辑
,原因:
赞赏
他的文章
- 关于迷宫题的一些求解思路 11050
- [原创]攻防世界PWN新手区:int_overflow 7791
- [原创]攻防世界PWN新手区:guess_num 11509
- [原创]攻防世界PWN新手区:level2 11796
- [原创]攻防世界PWN新手区:level0 6089
看原图
赞赏
雪币:
留言: