攻防世界 catch-me

题目分析

拿到文件之后,拖到ubuntu里发现是压缩包。在windows下改后缀名成.zip,能解压下来,再拖进ubuntu里,发现还是压缩包。。。
再改一次吧,成功拿到源文件。
在这里插入图片描述
先在ubuntu里跑一下,看下大致逻辑,emm给了flag是不对的。
在这里插入图片描述

上IDA分析一波,找到问题所在,flag的值被改变了。
攻防世界 catch-me_第1张图片
我们只要找到haystack最初的值不就行了。haystack在这里被赋值的,byte_6012A8的值又跟v3有关系。v3的值在IDA里找不到,看来是动态生成的,可以用gdb调出来。
攻防世界 catch-me_第2张图片
下断点在0x000000000040056C处,看RAX寄存器的数值就是v3,v3=0xb11924e1

pwndbg> b *0x000000000040056C
Breakpoint 2 at 0x40056c
pwndbg> c
Continuing.

Breakpoint 2, 0x000000000040056c in ?? ()
LEGEND: STACK | HEAP | CODE | DATA | RWX | RODATA
───────────────────────────────────────────────────────────────────────────────────────────────[ REGISTERS ]────────────────────────────────────────────────────────────────────────────────────────────────
 RAX  0xb11924e1
 RBX  0x0
 RCX  0x1
 RDX  0x1
 RDI  0x1
 RSI  0x0
 R8   0xffffffff
 R9   0x7ffff7de7ac0 (_dl_fini) ◂— push   rbp
 R10  0x0
 R11  0x282
 R12  0x40071b ◂— xor    ebp, ebp
 R13  0x7fffffffdb80 ◂— 0x1
 R14  0x0
 R15  0x0
 RBP  0x400cb0 ◂— push   r15
 RSP  0x7fffffffdaa0 ◂— 0x0
 RIP  0x40056c ◂— mov    ebx, eax
─────────────────────────────────────────────────────────────────────────────────────────────────[ DISASM ]─────────────────────────────────────────────────────────────────────────────────────────────────
 ► 0x40056c    mov    ebx, eax
   0x40056e    shr    eax, 0x18
   0x400571    mov    edi, 0x400d34
   0x400576    mov    byte ptr [rip + 0x200d2c], al
   0x40057c    mov    eax, ebx
   0x40057e    shr    eax, 0x10
   0x400581    and    eax, 0xfffffffd
   0x400584    mov    byte ptr [rip + 0x200d1f], al
   0x40058a    mov    eax, ebx
   0x40058c    shr    eax, 8
   0x40058f    and    eax, 0xffffffdf

v3知道了我们就可以伪造getenv(“ASIS”)&getenv(“CTF”)的值了
0xb11924e1^0xFEEBFEEB=0x4ff2da0a
getenv(“ASIS”)&getenv(“CTF”)=0x4ff2da0a
那getenv(“ASIS”)和getenv(“CTF”)分别是多少哪。在上面可以看到getenv(“ASIS”)的值被赋给了dword_6012AC,这个数组也与我们的flag有关。
看来只能爆getenv(“ASIS”)的值了,我们先假设getenv(“ASIS”)=getenv(“CTF”)=0x4ff2da0a,看试试行不行。
0x4ff2da0a&0x4ff2da0a=0x4ff2da0a

开始尝试

设置ASIS和CTF的环境变量,运行程序。

export ASIS="$(printf "\x0a\xda\xf2\x4f")"				#注意参数是从低位到高位的
export CTF="$(printf "\x0a\xda\xf2\x4f")"

在这里插入图片描述
看来是不行的,我查看了一下环境变量发现"\x0a"被转义成换行了,难搞啊。
攻防世界 catch-me_第3张图片
上gdb,把getenv(“ASIS”)和getenv(“CTF”)都修改一下

b *0x4005A3
c
n
set $rax=1
n
n
n
set $rax=0x601280
n
set $ebx=0xfeebfeeb
n
n
n
n
set $rax=0x601280
n
set $eax=0x4ff2da0a
n
n

然后会进入一个循环,循环0x21次后查看flag的地址的内存,得到flag

攻防世界 catch-me_第4张图片

你可能感兴趣的:(逆向)