免费A级毛片无码专区网站-成人国产精品视频一区二区-啊 日出水了 用力乖乖在线-国产黑色丝袜在线观看下-天天操美女夜夜操美女-日韩网站在线观看中文字幕-AV高清hd片XXX国产-亚洲av中文字字幕乱码综合-搬开女人下面使劲插视频

Pwn學習隨筆( 三 )


>>> context.arch= 'i386'>>> context.os= 'linux'>>> context.endian= 'little'>>> context.word_size = 32當然 , 你也可以一次性設置好這些變量:
>>> asm('nop')'\x90'>>> context(arch='arm', os='linux', endian='big', word_size=32)>>> asm('nop')'\xe3 \xf0\x00'

  • IO模塊:這個比較容易跟zio搞混 , 記住zio是read、write , pwn是recv、send
  • send(data): 發(fā)送數據sendline(data) : 發(fā)送一行數據 , 相當于在末尾加\nrecv(numb=4096, timeout=default) : 給出接收字節(jié)數,timeout指定超時recvuntil(delims, drop=False) : 接收到delims的pattern(以下可以看作until的特例)recvline(keepends=True) : 接收到\n , keepends指定保留\nrecvall() : 接收到EOFrecvrepeat(timeout=default) : 接收到EOF或timeoutinteractive() : 與shell交互
    • ELF模塊:獲取基地址、獲取函數地址(基于符號)、獲取函數got地址、獲取函數plt地址
    e = ELF('/bin/cat')>>> print hex(e.address)# 文件裝載的基地址0x400000>>> print hex(e.symbols['write']) # 函數地址0x401680>>> print hex(e.got['write']) # GOT表的地址0x60b070>>> print hex(e.plt['write']) # PLT的地址0x401680>>> print hex(e.search('/bin/sh').next())# 字符串/bin/sh的地址
    • 在編寫exp時 , 最常見的工作就是在整數之間轉換 , 而且轉換后 , 它們的表現形式就是一個字節(jié)序列 , pwntools提供了打包函數 。
    p32/p64: 打包一個整數 , 分別打包為32位或64位u32/u64: 解包一個字符串 , 得到整數# 比如將0xdeadbeef進行32位的打包 , 將會得到'\xef\xbe\xad\xde'(小端序)payload = p32(0xdeadbeef)#pack 32 bits numberpayload = p64(0xdeadbeef)#pack 64 bits number
    • 匯編和反匯編
      # 匯編:>>> asm('nop')'\x90'>>> asm('nop', arch='arm')'\x00\xf0 \xe3'# 可以使用context來指定cpu類型以及操作系統(tǒng)>>> context.arch= 'i386'>>> context.os= 'linux'>>> context.endian= 'little'>>> context.word_size = 32# 反匯編>>> print disasm('6a0258cd80ebf9'.decode('hex'))0:6a 02push0x22:58popeax3:cd 80int0x805:eb f9jmp0x0注意 , asm需要binutils中的as工具輔助 , 如果是不同于本機平臺的其他平臺的匯編 , 例如在我的x86機器上進行mips的匯編就會出現as工具未找到的情況 , 這時候需要安裝其他平臺的cross-binutils 。
    • Shellcode生成器
      >>> print shellcraft.i386.nop().strip('\n')nop>>> print shellcraft.i386.linux.sh()/* push '/bin///sh\x00' */push 0x68push 0x732f2f2fpush 0x6e69622f...結合asm可以可以得到最終的pyaload
      from pwn import *context(os='linux',arch='amd64')shellcode = asm(shellcraft.sh())或者from pwn import *shellcode = asm(shellcraft.amd64.linux.sh())
    • ROP鏈生成器
      elf = ELF('ropasaurusrex')rop = ROP(elf)rop.read(0, elf.bss(0x80))rop.dump()# ['0x0000:0x80482fc (read)',#'0x0004:0xdeadbeef',#'0x0008:0x0',#'0x000c:0x80496a8']str(rop)# '\xfc\x82\x04\x08\xef\xbe\xad\xde\x00\x00\x00\x00\xa8\x96\x04\x08'
    ? 因為ROP對象實現了getattr的功能 , 可以直接通過func call的形式來添加函數 , rop.read(0, elf.bss(0x80))實際相當于rop.call('read', (0,elf.bss(0x80))) 。通過多次添加函數調用 , 最后使用str將整個rop chain dump出來就可以了 。