-
-
[分享]MSC write up 2题
-
发表于: 2015-1-26 18:51 3130
-
1. 第一题从android 的logcat里可以看到三串字符串,分别为table ,pw 和enpassword
根据pw的提示,在table中对应到下标,即可算出最终的一组数字
2. 第二题
用IDA反汇编lib下的libcrackme.so 可以看到关键的计算逻辑
.text:63CF1298 MOV R0, R5
.text:63CF129C BLX R3
.text:63CF12A0 LDR R1, =(off_63CF628C - 0x63CF5FBC)
.text:63CF12A4 LDR R2, [R1,R7] ; off_63CF628C
其中:
.data:63CF628C off_63CF628C DCD aWojiushidaan ; DATA XREF: Java_com_yaotong_crackme_MainActivity_securityCheck+FCr
.data:63CF628C ; .text:off_63CF1308o
.data:63CF628C ; .data ends ; "wojiushidaan"
但输入这个字符串提示错误,这个字符串的位置是在程序运行中动态修改过的,而用调试器动态调试时会因为有动态监测而导致程序退出,在init_array的位置,我们可以解密出dlsym的字符串,其中动态获取sleep和pthread_create地址的逻辑,如下:
if ( !unk_63CF6367 )
{
get_func_name3((char *)&str_sleep, 6, "9恫28€", (char *)&unk_63CF44FC, 0, 1);
unk_63CF6367 = 1;
}
p_sleep = (int (__fastcall *)(_DWORD))((int (__fastcall *)(_DWORD, _DWORD))p_dlsym)(-1, &str_sleep);
if ( !unk_63CF6368 )
{
get_func_name4((char *)&str_pthread_create, 15, "3:*8(-&\x1B\"@%%7)B", "BMAE", 4u, 1);
unk_63CF6368 = 1;
}
p_pthread_create = (int (__fastcall *)(_DWORD, _DWORD, _DWORD, _DWORD))((int (__fastcall *)(_DWORD, _DWORD))p_dlsym)(
-1,
&str_pthread_create);
查找p_pthread_create的交叉引用,可以看到起的线程函数:
int sub_63CF16D4()
{
int v0; // r0@1
char handle; // [sp+4h] [bp-Ch]@1
v0 = p_pthread_create(&handle, 0, check_function, 0);
return sub_63CF17F4(v0);
}
check_function内部的逻辑为:
void __noreturn check_function()
{
check_function2();
p_sleep(3);
}
这里修改这个文件的二进制文件,让其一直循环sleep,修改后的逻辑:
void __noreturn check_function()
{
check_function2();
p_sleep(3);
JUMPOUT(loc_63CF16C8);
}
对应代码:
.text:63CF16A4 check_function ; DATA XREF: sub_63CF16D4+18o
.text:63CF16A4 ; .text:off_63CF1718o ...
.text:63CF16A4 STMFD SP!, {R4,LR}
.text:63CF16A8 LDR R0, =(_GLOBAL_OFFSET_TABLE_ - 0x63CF16B8)
.text:63CF16AC LDR R1, =(unk_63CF6290 - 0x63CF5FBC)
.text:63CF16B0 ADD R0, PC, R0 ; _GLOBAL_OFFSET_TABLE_
.text:63CF16B4 ADD R4, R1, R0 ; unk_63CF6290
.text:63CF16B8 BL check_function2
.text:63CF16BC
.text:63CF16BC loc_63CF16BC ; CODE XREF: .text:loc_63CF16C8j
.text:63CF16BC LDR R1, [R4,#(p_sleep - 0x63CF6290)]
.text:63CF16C0 MOV R0, #3
.text:63CF16C4 BLX R1
此时用IDA可以动态调试此程序,断到之前的那个判断woshidaan的字符串位置,点击两次发送,即可以看到原先woshidaan的位置的字符串已经被改为正确的答案了。
根据pw的提示,在table中对应到下标,即可算出最终的一组数字
2. 第二题
用IDA反汇编lib下的libcrackme.so 可以看到关键的计算逻辑
.text:63CF1298 MOV R0, R5
.text:63CF129C BLX R3
.text:63CF12A0 LDR R1, =(off_63CF628C - 0x63CF5FBC)
.text:63CF12A4 LDR R2, [R1,R7] ; off_63CF628C
其中:
.data:63CF628C off_63CF628C DCD aWojiushidaan ; DATA XREF: Java_com_yaotong_crackme_MainActivity_securityCheck+FCr
.data:63CF628C ; .text:off_63CF1308o
.data:63CF628C ; .data ends ; "wojiushidaan"
但输入这个字符串提示错误,这个字符串的位置是在程序运行中动态修改过的,而用调试器动态调试时会因为有动态监测而导致程序退出,在init_array的位置,我们可以解密出dlsym的字符串,其中动态获取sleep和pthread_create地址的逻辑,如下:
if ( !unk_63CF6367 )
{
get_func_name3((char *)&str_sleep, 6, "9恫28€", (char *)&unk_63CF44FC, 0, 1);
unk_63CF6367 = 1;
}
p_sleep = (int (__fastcall *)(_DWORD))((int (__fastcall *)(_DWORD, _DWORD))p_dlsym)(-1, &str_sleep);
if ( !unk_63CF6368 )
{
get_func_name4((char *)&str_pthread_create, 15, "3:*8(-&\x1B\"@%%7)B", "BMAE", 4u, 1);
unk_63CF6368 = 1;
}
p_pthread_create = (int (__fastcall *)(_DWORD, _DWORD, _DWORD, _DWORD))((int (__fastcall *)(_DWORD, _DWORD))p_dlsym)(
-1,
&str_pthread_create);
查找p_pthread_create的交叉引用,可以看到起的线程函数:
int sub_63CF16D4()
{
int v0; // r0@1
char handle; // [sp+4h] [bp-Ch]@1
v0 = p_pthread_create(&handle, 0, check_function, 0);
return sub_63CF17F4(v0);
}
check_function内部的逻辑为:
void __noreturn check_function()
{
check_function2();
p_sleep(3);
}
这里修改这个文件的二进制文件,让其一直循环sleep,修改后的逻辑:
void __noreturn check_function()
{
check_function2();
p_sleep(3);
JUMPOUT(loc_63CF16C8);
}
对应代码:
.text:63CF16A4 check_function ; DATA XREF: sub_63CF16D4+18o
.text:63CF16A4 ; .text:off_63CF1718o ...
.text:63CF16A4 STMFD SP!, {R4,LR}
.text:63CF16A8 LDR R0, =(_GLOBAL_OFFSET_TABLE_ - 0x63CF16B8)
.text:63CF16AC LDR R1, =(unk_63CF6290 - 0x63CF5FBC)
.text:63CF16B0 ADD R0, PC, R0 ; _GLOBAL_OFFSET_TABLE_
.text:63CF16B4 ADD R4, R1, R0 ; unk_63CF6290
.text:63CF16B8 BL check_function2
.text:63CF16BC
.text:63CF16BC loc_63CF16BC ; CODE XREF: .text:loc_63CF16C8j
.text:63CF16BC LDR R1, [R4,#(p_sleep - 0x63CF6290)]
.text:63CF16C0 MOV R0, #3
.text:63CF16C4 BLX R1
此时用IDA可以动态调试此程序,断到之前的那个判断woshidaan的字符串位置,点击两次发送,即可以看到原先woshidaan的位置的字符串已经被改为正确的答案了。
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)
赞赏
他的文章
- [原创] AArch64中va_list/va_start/va_arg/...的实现 19796
- [原创] AArch64函数栈的分配,指令生成与GCC实现(上) 19493
- [原创] 内核模块的加载流程 55110
- [原创] linux中的信号处理与SROP 26150
- [原创] AARCH64平台的栈回溯 30290
看原图
赞赏
雪币:
留言: