由于不会汇编,每次对着Ollydbg或者恶心的Linux自带的GDB调试的时候都一脸懵逼,由于第一次尝试remote Linux debugger时一直连不上直接给我劝退了,后来经过几天的坐牢和学长帮助发现是vmware的虚拟网卡被防火墙给屏蔽了,关闭防火墙重新安装vmware终于可以实现虚拟机与主机的互ping之后,萌新开始了第一次动调。

先拿一道攻防世界题举例:no-string-attached
反编译之后发现关键代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void authenticate()
{
wchar_t ws[8192]; // [esp+1Ch] [ebp-800Ch] BYREF
wchar_t *s2; // [esp+801Ch] [ebp-Ch]

s2 = (wchar_t *)decrypt((wchar_t *)&s, (wchar_t *)&dword_8048A90);
if ( fgetws(ws, 0x2000, stdin) )
{
ws[wcslen(ws) - 1] = 0;
if ( !wcscmp(ws, s2) )
wprintf(&unk_8048B44);
else
wprintf(&unk_8048BA4);
}
free(s2);
}

发现只要运行了decrypt函数即可获得flag,考虑动调。
扔进Exeinfo PE:

发现是linux下的程序,需要远程调试,以下为操作步骤:

  • 将Linux_server和Linux_server64两个文件放到共享文件夹(分别对应32位和64位程序,此题只需32位)
  • 将待调试文件放到共享文件夹
  • 查询Linux虚拟机IP地址
  • 用IDApro打开待调试程序
  • 选择对应的调试环境
  • 在decrypt后一行下断点
  • 在Linux找到共享文件夹后打开Linux_server
  • IDApro中设置Hostname为刚才查到的IP
  • 开始调式,按TAB键可以实现C语言和汇编语言的切换

  • 此时程序已经执行到断点处,可以直接查到s2的值,得到flag:9447{you_are_an_international_mystery}