首页
社区
课程
招聘
[分享]MSC write up 2题
2015-1-26 18:51 2973

[分享]MSC write up 2题

2015-1-26 18:51
2973
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的位置的字符串已经被改为正确的答案了。

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
点赞0
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回