BUUCTF-Youngter-drive
1.UPX脱壳
这个程序不知道为什么打不开,就不手动脱壳了
复制到kali linux
终端输入
upx -d 文件名
得到的文件就是脱壳好的文件
2.堆栈不平衡导致ida分析失败
在进入ida分析的函数时,ida显示:
Decompilation failure:
xxxxxx: positive sp value has been found
解决方法:
显示esp的值,按g跳转到xxxxxx,ALT+k修改esp的值
深入了解请看:
https://www.cnblogs.com/xunbu7/p/7779309.html
3.互斥体
拖进ida
int main_0()
{
HANDLE v1; // [esp+D0h] [ebp-14h]
HANDLE hObject; // [esp+DCh] [ebp-8h]
sub_4110FF();
::hObject = CreateMutexW(0, 0, 0);
j_strcpy(Dest, Source);
hObject = CreateThread(0, 0, (LPTHREAD_START_ROUTINE)StartAddress, 0, 0, 0);
v1 = CreateThread(0, 0, (LPTHREAD_START_ROUTINE)sub_41119F, 0, 0, 0);
CloseHandle(hObject);
CloseHandle(v1);
while ( dword_418008 != -1 )
;
sub_411190();
CloseHandle(::hObject);
return 0;
}
这里创建了两个线程,一个互斥体,但这并不意味着两个线程一定交替进行
下面是这两个线程对应的函数
void __stdcall StartAddress_0(int a1)
{
while ( 1 )
{
WaitForSingleObject(hObject, 0xFFFFFFFF);
if ( dword_418008 > -1 )
{
sub_41112C((int)Source, dword_418008);
--dword_418008;
Sleep(0x64u);
}
ReleaseMutex(hObject);
}
}
void __stdcall sub_411B10(int a1)
{
while ( 1 )
{
WaitForSingleObject(hObject, 0xFFFFFFFF);
if ( dword_418008 > -1 )
{
Sleep(0x64u);
--dword_418008;
}
ReleaseMutex(hObject);
}
}
但我自己在VS里实验发现:
如果两个线程函数都有函数Sleep(),那么这两个线程一定交替执行
如果没有Sleep(),那么一个线程可能多次执行,即出现刚把互斥体释放,又自己把互斥体抢回来的情况。
所以这两个线程一定是交替执行
4.exit(0)
//是sub_41112C函数,a1是(int)Source,a2是dword_418008
char *__cdecl sub_411940(int a1, int a2)
{
char *result; // eax
char v3; // [esp+D3h] [ebp-5h]
v3 = *(_BYTE *)(a2 + a1);
if ( (v3 < 97 || v3 > 122) && (v3 < 65 || v3 > 90) )
exit(0);
if ( v3 < 97 || v3 > 122 )
{
result = off_418000[0];
*(_BYTE *)(a2 + a1) = off_418000[0][*(char *)(a2 + a1) - 38];
}
else
{
result = off_418000[0];
*(_BYTE *)(a2 + a1) = off_418000[0][*(char *)(a2 + a1) - 96];
}
return result;
}
dword_418008 = 0x1d(29)
在最后比对的时候只比对了29位,我们可以逆向推出这29位
但是提交后答案错误
并且我们在sub_41112C函数中看到了
v3 = *(_BYTE *)(a2 + a1);
a2一开始是29 ,那么v3代表Source的第30位
if ( (v3 < 97 || v3 > 122) && (v3 < 65 || v3 > 90) )
exit(0);
说明第30位是字母,否则exit(0)
exit(0)是退出程序,整个程序就终止了
暴力试最后一位,最后’E’正确
本文详细介绍了在CTF比赛中遇到的逆向分析问题,包括UPX脱壳、ida分析堆栈不平衡的解决、互斥体在多线程中的应用以及exit(0)在程序终止中的角色。通过分析,揭示了线程执行和程序验证的关键点。
807

被折叠的 条评论
为什么被折叠?



