-
-
[原创]BUUCTF逆向题:[Zer0pts2020]easy strcmp
-
发表于: 2022-3-27 17:39 5377
-
1.基本信息探查:
1.EXEinfo:
2.运行一下:
2.IDA分析:
1.主函数分析:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | __int64 __fastcall main( int a1, char * * a2, char * * a3) { if ( a1 > 1 ) { if ( !strcmp(a2[ 1 ], "zer0pts{********CENSORED********}" ) ) puts( "Correct!" ); else puts( "Wrong!" ); } else { printf( "Usage: %s <FLAG>\n" , * a2); } return 0LL ; } |
a2为输入的flag与右边这个值比对,一开始还以为和上题一样是直接提交flag,但是提交后发现失败; 看来没这么简单,但是单看主函数也没发现什么异常,之前做过一些题在init函数动过手脚(init里面调用函数改码表),这里同样先看一下边上的函数,发现sub_6EA函数调用了字符串:
2.sub_6EA函数分析:
1 2 3 4 5 6 7 8 9 10 11 12 13 | __int64 __fastcall sub_6EA(__int64 a1, __int64 a2) { int i; / / [rsp + 18h ] [rbp - 8h ] int v4; / / [rsp + 18h ] [rbp - 8h ] int j; / / [rsp + 1Ch ] [rbp - 4h ] for ( i = 0 ; * (_BYTE * )(i + a1); + + i ) / / 相当于求串长,串长放在了i里面 ; v4 = (i >> 3 ) + 1 ; / / v4 = 5 for ( j = 0 ; j < v4; + + j ) / / 相当于分成 5 块来计算,一块 8 个字符 * (_QWORD * )( 8 * j + a1) - = qword_201060[j]; return qword_201090(a1, a2); } |
基本逻辑就是将输入以8个字符为一组分割,分别减去qword_201060的值,跟一下qword_201060的值:
shift+E提取:(我们只要用这些)
1 | 42094A4935430A41 ,F019E60BF5F20E0B, 2B28354A063A0A4F |
exp:
1 2 3 4 5 6 7 8 9 10 11 12 | rflag = "********CENSORED********" m = [ 0x410A4335494A0942 , 0x0B0EF2F50BE619F0 , 0x4F0A3A064A35282B ] import binascii flag = b'' for i in range ( 3 ): p = rflag[i * 8 :(i + 1 ) * 8 ] a = binascii.b2a_hex(p.encode( 'ascii' )[:: - 1 ]) b = binascii.a2b_hex( hex ( int (a, 16 ) + m[i])[ 2 :])[:: - 1 ] flag + = b print (flag) |
flag{l3ts_m4k3_4_DETOUR_t0d4y}
赞赏
他的文章
- 关于迷宫题的一些求解思路 11136
- [原创]攻防世界PWN新手区:int_overflow 7828
- [原创]攻防世界PWN新手区:guess_num 11539
- [原创]攻防世界PWN新手区:level2 11815
- [原创]攻防世界PWN新手区:level0 6110
看原图
赞赏
雪币:
留言: