Szarny.io

There should be one-- and preferably only one --obvious way to do it.

straceとltraceでトレース

はじめに

strace [対象コマンド] 対象コマンドを実行しながら,システムコールを詳細にトレースし出力する.
ltrace [対象コマンド] 対象コマンドを実行しながら,ライブラリ関数を詳細にトレースし出力する.

ltraceの実例

PINの認証を行うプログラムを突破する問題

#include <stdio.h>
#include <string.h>

int main(){
  char buffer[32];
  char key[] = "4649";

  puts("Please input the PIN.");
  fgets(buffer, sizeof(buffer), stdin);
  strtok(buffer, "\n");

  if(!strcmp(buffer, key)){
    puts("Correct!");
  }else{
    puts("Invalid.");
  }

  return 0;
}

ltraceで実行

root@kali:# ltrace ./ltrace 
puts("Please input the PIN."Please input the PIN.
)       = 22
fgets(0000
"0000\n", 32, 0x7f2d157838c0) = 0x7ffecbefae70
strtok("0000\n", "\n")              = "0000"
strcmp("0000", "4649")              = -4
puts("Invalid."Invalid.
)                    = 9
+++ exited (status 0) +++

ここで,4649と比較してるとわかるので

root@kali:# ./ltrace
Please input the PIN.
4649
Correct!

突破( ^)o(^ )

straceの実例

プログラムが生成した子プロセスのIDを答える問題

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>

int main(){
  pid_t pid;
  char buffer[16];
  int user_input;

  pid = fork();

  if(pid == 0){
    puts("Segmentation Fault");
    exit(0);
  }else{
    puts("Child Process ID : ");
    fgets(buffer, sizeof(buffer), stdin);
    user_input = atoi(buffer);

    if(pid == user_input){
      puts("Correct!");
    }else{
      puts("Invalid.");
    }
  }

  return 0;
}

straceで実行.

root@kali:# strace ./strace 
execve("./strace", ["./strace"], [/* 49 vars */]) = 0
brk(NULL)                               = 0x560ee0c47000
()
munmap(0x7faa9ded4000, 125939)          = 0
clone(child_stack=NULL, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7faa9ded29d0) = <b><span style="color: #ff0000">2204</span></b>
fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 0), ...}) = 0
()
read(0, 2204
"2204\n", 1024)                 = 5
write(1, "Correct!\n", 9Correct!
)               = 9
exit_group(0)                           = ?
+++ exited with 0 +++

cloneの返り値に子プロセスのIDが設定されているので,入力して突破.

参考書籍

セキュリティコンテストチャレンジブック -CTFで学ぼう! 情報を守るための戦い方-

セキュリティコンテストチャレンジブック -CTFで学ぼう! 情報を守るための戦い方-