就按照题目的难易程度写
新手区没有涉及到栈的相关知识,几乎是栈漏洞
get_shell
第一个题目比较简单
ida进入main函数查看,有system和bin/sh
直接nc连接就可以拿到flag
CGfsb
通过main函数可以看出,当pwnme=8,就可以拿到flag
漏洞点:格式化字符漏洞,printf()函数使用不当,造成任意内存读写,解决方法:利用%n将%n之前printf已经打印的字符个数赋值给偏移处指针所指向的地址位置
pwnme地址 偏移 exp flaghello_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 exp1buf大小是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了
paddingstring
printf函数处发现一个格式化字符串漏洞
回去看一下,发现v5=(_int64)v4,可以看到程序给出了这两个数,一个是68, 一个是85,并且可以看到程序会将数组的地址打印出来的,
当v4=85时,v4[0]的地址也就泄露出来了,可以利用上面发现的格式化字符串漏洞,将v3[0]改写成85,这样就可以到达v1的位置
./string
网友评论