The Last Hope

Posted by rk700 on June 23, 2014

http://www.wechall.net/challenge/bsdhell/thelasthope/index.php
这道题给了一个32位的ELF文件

首先试着运行,发现停住了,从IDA反汇编得到的代码可以得知有反调试之类的措施,于是我们必须先去掉那些干扰

参考这两篇文章:
http://dbp-consulting.com/tutorials/debugging/linuxProgramStartup.html
http://www.exploit-db.com/papers/13234/
在调用main之前会调用.ctors中的函数。于是我们先查看.ctors:

lrk@laptop:~/tmp$ objdump -s -j .ctors ./bsd_thelasthope.elf
./bsd_thelasthope.elf:     file format elf32-i386
Contents of section .ctors:
 804af00 ffffffff 5b8c0408 00000000           ....[.......

其中0x08048c5b那里的函数会被调用,而检查发现那个函数是anti_ptrace,于是我们将0x0804af04处的值改为0xffffffff。这样就不会在__do_global_ctors_aux里调用anti_ptrace

接下来,看反汇编得到的代码

.text:08048D59                 call    anti_ptrace
.text:08048D5E                 mov     dword ptr [esp+4], offset handler ; handler
.text:08048D66                 mov     dword ptr [esp], 5 ; sig
.text:08048D6D                 call    _signal

同样,我们不要调用anti_ptrace,所以将0x08048d59处改为0x90 NOP;
另一方面,5是SIGTRAP的值,这是调试器用的,signal会将一个空函数注册到那个事件,我们不想那样,于是将0x08048d6d处也改为NOP

接下来还有反调试的代码:

.text:08048DA1                 mov     dword ptr [esp+0Ch], 0
.text:08048DA9                 mov     dword ptr [esp+8], 1
.text:08048DB1                 mov     dword ptr [esp+4], 0
.text:08048DB9                 mov     dword ptr [esp], 0 ; request
.text:08048DC0                 call    _ptrace
.text:08048DC5                 test    eax, eax
.text:08048DC7                 jns     short loc_8048DE1

这里我是将call _ptrace改为xor eax,eax

到此反调试的代码基本就解决了,然后是得到username和password

通过读几个函数,我们知道username的长度<=6,不包含大写字母,

U[3]%5 == 0 (candidates: 65, 70, 75, 80, 85, 90)
2^(U[2]-1)mod(U[2])==1 (prime number?)
2^(U[5]-1)mod(U[5])==1 (prime number?)
total = U[2]+U[3]+U[5]+13(U[0]+U[1]+U[4]) = 3285
U[0]=87
U[1]=72
U[4]=77

尝试几个素数,得到一个可行解为whoami

password要简单一些:

password: 13>=len>8 (len==10?)
l=[31,10,30,17,11,9,25,15,1,20,22,12,6,13,101]
encrypt: p ^ l => P
chomp: remove last byte(new line)
chomp(P)==Oxw|n]nfog

得到password为PrimeTwins