一个简单ctf的逆向。
本帖最后由 whyida 于 2017-10-25 20:18 编辑原帖地址:
https://www.52pojie.cn/thread-654545-1-1.html
查壳为upx ,直接上脱壳机脱壳,ida载入
.text:00401460 ; int __cdecl main(int argc, const char **argv, const char **envp)
.text:00401460 public _main
.text:00401460 _main proc near ; CODE XREF: sub_4011B0+D0p
.text:00401460
.text:00401460 Str = dword ptr -30h
.text:00401460 var_2C = dword ptr -2Ch
.text:00401460 var_1A = byte ptr -1Ah
.text:00401460 var_19 = byte ptr -19h
.text:00401460 var_18 = byte ptr -18h
.text:00401460 var_17 = byte ptr -17h
.text:00401460 var_16 = byte ptr -16h
.text:00401460 var_15 = byte ptr -15h
.text:00401460 var_14 = byte ptr -14h
.text:00401460 var_13 = byte ptr -13h
.text:00401460 var_12 = byte ptr -12h
.text:00401460 var_11 = byte ptr -11h
.text:00401460 var_10 = byte ptr -10h
.text:00401460 var_F = byte ptr -0Fh
.text:00401460 var_E = byte ptr -0Eh
.text:00401460 var_D = byte ptr -0Dh
.text:00401460 var_C = byte ptr -0Ch
.text:00401460 var_B = byte ptr -0Bh
.text:00401460 var_A = byte ptr -0Ah
.text:00401460 var_9 = byte ptr -9
.text:00401460 var_8 = dword ptr -8
.text:00401460 var_4 = dword ptr -4
.text:00401460 argv = dword ptr0Ch
.text:00401460 envp = dword ptr10h
.text:00401460
.text:00401460 push ebp
.text:00401461 mov ebp, esp
.text:00401463 and esp, 0FFFFFFF0h
.text:00401466 sub esp, 30h
.text:00401469 call ___main
.text:0040146E mov , offset Str ; "please input a number:"
.text:00401475 call _puts
.text:0040147A lea eax,
.text:0040147E mov , eax
.text:00401482 mov , offset Format ; "%d"
.text:00401489 call _scanf
.text:0040148E mov , 83h
.text:00401493 mov , 7Ch
.text:00401498 mov , 86h
.text:0040149D mov , 7Fh
.text:004014A2 mov , 6Ah
.text:004014A7 mov , 8Fh
.text:004014AC mov , 93h
.text:004014B1 mov , 8Ah
.text:004014B6 mov , 82h
.text:004014BB mov , 77h
.text:004014C0 mov , 6Ch
.text:004014C5 mov , 7Fh
.text:004014CA mov , 86h
.text:004014CF mov , 74h
.text:004014D4 mov , 7Ah
.text:004014D9 mov , 66h
.text:004014DE mov , 9Ah
.text:004014E3 mov , 5Bh
.text:004014E8 mov , 0
.text:004014F0 jmp short loc_40151B
.text:004014F2 ; ---------------------------------------------------------------------------
.text:004014F2
.text:004014F2 loc_4014F2: ; CODE XREF: _main+C0j
.text:004014F2 mov edx,
.text:004014F6 lea ecx,
.text:004014FA mov eax,
.text:004014FE add eax, ecx
.text:00401500 movzx eax, byte ptr
.text:00401503 movsx eax, al
.text:00401506 sub edx, eax
.text:00401508 mov eax, edx
.text:0040150A sub eax,
.text:0040150E mov , eax ; Ch
.text:00401511 call _putchar
.text:00401516 add , 1
.text:0040151B
.text:0040151B loc_40151B: ; CODE XREF: _main+90j
.text:0040151B cmp , 11h
.text:00401520 jle short loc_4014F2
.text:00401522 mov , 0Ah ; Ch
.text:00401529 call _putchar
.text:0040152E mov , offset aIfYouCanTSeeFl ; "if you can't see flag,the number is wro"...
.text:00401535 call _puts
.text:0040153A nop
.text:0040153B leave
.text:0040153C retn
.text:0040153C _main endp
F5 得到伪c 代码:
char v4; // @1
char v5; // @1
char v6; // @1
char v7; // @1
char v8; // @1
char v9; // @1
char v10; // @1
char v11; // @1
char v12; // @1
char v13; // @1
char v14; // @1
char v15; // @1
char v16; // @1
char v17; // @1
char v18; // @1
char v19; // @1
char v20; // @1
char v21; // @1
int v22; // @1
int i; // @1
__main();
puts("please input a number:");
scanf("%d", &v22);
v4 = -125;
v5 = 124;
v6 = -122;
v7 = 127;
v8 = 106;
v9 = -113;
v10 = -109;
v11 = -118;
v12 = -126;
v13 = 119;
v14 = 108;
v15 = 127;
v16 = -122;
v17 = 116;
v18 = 122;
v19 = 102;
v20 = -102;
v21 = 91;
for ( i = 0; i <= 17; ++i )
putchar(v22 - *(&v4 + i) - i);
putchar(10);
return puts("if you can't see flag,the number is wrong!!!");
}
flag 第一个字母位“f” asII 码为0x66 ,十进制 102.也就是
x-(-125)=102,x=-23
用c描述就是这样:
#include <stdio.h>
void main()
{
int i;
int s[]={-125,124,-122,127,106,-113,-109,-118,-126,119,108,127,-122,116,122,102,-102,91};
for(i=0;i<=17;i++)
{
putchar(-23- (s【i】)-i);
}
putchar(10);
}
想请教一下这个UPX壳该怎么脱。我OD载入后直接是0040C350这个jmp语句,跳到0040C36Cretn语句(return to 77179930)。如果我在retn语句的下面一行F4,OD就处于running状态等待我输入字符,没办法断下。我直接用二次内存镜像法也不行,所以想请教一下,谢谢。
图片见附件 我用od脱完壳后,程序运行没问题,但再用od载入时,发现od停下的点还是和之前一样(代码变了),但exeinfo显示的entry point与我找的oep一样。转到我找的oep发现也被解压了,这是怎么回事,是oep找错了吗?求大佬指点下 你好楼主,脱脱一个绝地的辅助吗? 啊 这题啊 蓝盾CTF里很基础的签到题 a774733519 发表于 2017-10-25 15:21
你好楼主,脱脱一个绝地的辅助吗?
没玩过。 Ronpa 发表于 2017-10-25 15:21
啊 这题啊 蓝盾CTF里很基础的签到题
是很简单。 本帖最后由 xiaofengzi 于 2017-10-25 19:25 编辑
我照着这个实践了2个小时,看看前面的发言,发现自己还是太菜了{:1_937:}
另外最后c语言那里s应该为是s [ i ] 感谢老铁的思路分享{:1_919:} 感觉一道小题解起来都好久哦。。。 同新手路过{:1_937:} 一起加油! xiaofengzi 发表于 2017-10-25 19:12
我照着这个实践了2个小时,看看前面的发言,发现自己还是太菜了
另外最后c语言那里s应该为是s [...
论坛会吃代码。你用代码编辑框重发一遍试试看。 lanlana 发表于 2017-10-25 19:28
感谢老铁的思路分享
再找几个练练手。