wargame.kr 포스트는 이해한 내용과 복습을 위한 목적으로 작성되었습니다.

이번 포스트에서는 strcmp 문제에 대한 이해와 풀이를 진행해보도록 하겠습니다.


이번 문제도 어려움이 많았습니다. 이번 문제는 SQL 뿐만 아니라 PHP와 웹에 대한 이해가 필요합니다.


마음을 다잡고 문제를 풀어보도록 합시다.



 

 문제 이해


문제는 다음과 같습니다.


문제에서는 strcmp 함수의 취약점을 이용하여 우회 후, 플래그를 가져가라는 메시지가 작성되어 있습니다.

앙, 문제를 풀면서 strcmp 취약점에 대해 찾아봐야겠습니다.


문제로 들어가 소스를 확인해보았습니다.

<?php
    require("../lib.php"); // for auth_code function

    $password = sha1(md5(rand().file_get_contents("/var/lib/dummy_file")).rand());

    if (isset($_GET['view-source'])) {
        show_source(__FILE__);
        exit();
    }else if(isset($_POST['password'])){
        sleep(1); // do not brute force!
        if (strcmp($_POST['password'], $password) == 0) {
            echo "Congratulations! Flag is <b>" . auth_code("strcmp") ."</b>";
            exit();
        } else {
            echo "Wrong password..";
        }
    }

?>
<br />
<br />
<form method="POST">
    password : <input type="text" name="password" /> <input type="submit" value="chk">
</form>
<br />
<a href="?view-source">view-source</a>


4번 라인에서는 $password 값에 엄청나게 반복적으로 암호화를 수행한 것이 보입니다.

이렇게 해놓은 것으로 보아 password에 특정한 값을 넣어 때려맞추는 것은 불가능할 것 같습니다.


11번 라인에서는 strcmp 함수를 통해 비교한 값의 결과가 0이 리턴될 때 문제가 풀리도록 되어 있습니다.


이제 문제를 풀어봐야겠습니다.




 

 문제 풀이


일단 이번 문제를 풀기 앞서 strcmp에 대한 취약점을 찾아보도록 합시다.


 

 PHP strcmp 취약점


먼저 strcmp에 대한 이해가 먼저일 것 같습니다.


strcmp 함수는 두 개의 문자열을 비교하여 값을 리턴하는 구조입니다.


예시 : strcmp($a, $b);

(1) 만약 두 문자열의 값이 일치하면 0을 반환

(2) 만약 $a 값이 크면 양수를 반환

(3) 만약 $b 값이 크면 음수를 반환


그러나 PHP의 strcmp 함수는 문자열 두 개 중 하나가 배열일 경우 무조건 0을 반환한다는 취약점을 가지고 있습니다.


다음과 같은 테스트코드를 통해 시험을 해보실 수 있으실 것입니다.

<?php

$a = Array("a");
$b = "pass";

if(strcmp($a, $b)==0)
  echo "Strings are same !";
else
  echo "Strings are different!!";
?>


여기서 결과는 다음과 같습니다.


WARNING strcmp() expects parameter 1 to be string, array given on line number 6

Strings are same ! 


그렇다면 이제 POST 혹은 GET 방식으로 배열을 넘겨주게 되면 취약점으로 인해 우회가 가능할 것으로 보입니다.




 

 위의 기법을 응용한 문제풀이


위의 기법을 응요하기 위해서는 POST와 GET 방식으로 어떻게 배열을 보낼 수 있는지 알아봐야 합니다.

배열 값을 보내기 위해서는 다음과 같은 방법으로 보낼 수 있습니다.


GET : http://example.com/?value1[]='something'&value2[]='something'

POST : value1[]='something'&value2[]='something'


이제 값을 넘겨주도록 합시다.






wargame.kr 포스트는 이해한 내용과 복습을 위한 목적으로 작성되었습니다.

이번 포스트에서는 db_is_really_good 문제에 대한 이해와 풀이를 진행해보도록 하겠습니다.


이번 문제는 DB에 대한 이해와 파일 다운로드 취약성이 있는 곳을 찾아볼 수 있어야 합니다.

DB에 어떤 값을 넣어야 터지는지에 대한 학습을 쭈욱 하고, 따라오시는 것을 추천합니다.



 

 문제 이해


문제는 다음과 같습니다.


문제에서는 어떤 데이터베이스 종류인지, 물어보기도 합니다.

여기서 user name과 database 내에서 값을 얻을 수 있다고 힌트를 주고 있습니다.


이제 한 번 문제로 들어가보도록 합시다.



문제에는 user라는 입력란과, 로그인 버튼이 있습니다.

힌트에서 user라는 곳에서 답을 얻을 수 있다고 했으니 별의 별 걸 다 넣어봤습니다.


일단 admin은 안 되네요.


일단 aa를 입력하고 로그인이 되어 들어가보았습니다.

위에는 입력창이 있고 write와 logout 버튼이 있습니다.

각각 입력, 로그아웃 버튼입니다.


아래의 그림을 보아하니 누가 또 열심히 때려밖아본 흔적이 보입니다.


별의 별 걸 다 입력해보았는데, 변하는 것이 없었습니다.



 

 문제 풀이


이번 문제는 역시나 user 영역에서 답을 구할 수 있었습니다.


SQL Injection은 아니었습니다. 다만, 다른 방향의 Injection입니다.

이는 일종의 개발자의 설계 실수가 있었다는 가정하에 만든 문제 같았습니다.



 

 특별한 결과가 돌아오는 값들


이번 문제에서 . 과 /를 넣었을 때의 결과가 달랐습니다.


만약 .을 넣게 되면 _로 바뀌게 되고, /를 넣게 되면 Fatal Error가 발생했습니다.

일단 .을 넣게 됐을 때의 반응은 별다른 의미는 없어보이고, Fatal Error에서 좋은 힌트를 얻을 수 있었습니다.


위와 같은 Fatal Error가 있습니다.


에러 내용을 쭉 살펴보니, open() 함수에서 에러가 발생한 것을 볼 수 있습니다.

우리가 입력한 값이 /이기 때문에 /가 들어간 곳이 어디인지 살펴보면 wkrm_ 와 .db 사이에 /가 부자연스럽게 들어가 있는 것을 볼 수 있습니다.

아마 wkrm_.db 파일이겠구나 싶어 다운로드를 해봅니다.


다운로드를 마치고 SQLite Expert Personal 프로그램으로 내용을 살펴보니 별 거 없었습니다.


아 링크, http://www.sqliteexpert.com/


그리고, /db 디렉토리가 디렉토리 리스팅 취약점으로 인해 모두 보이는 것을 확인할 수 있었습니다.



보아하니, wkrm_ + '우리가 입력한 값' + .db로 파일이 생성되는 것이며, 그 db에 값이 입력되는 것이라고 볼 수 있을 것 같습니다.

그렇다면, 우리가 입력하지 못했던 값이 admin입니다.


admin을 뒤에 붙인 파일을 찾아 다운로드 해보도록 합시다.



잡았다 요놈..




wargame.kr 포스트는 이해한 내용과 복습을 위한 목적으로 작성되었습니다.

이번 포스트에서는 md5_password 문제에 대한 이해와 풀이를 진행해보도록 하겠습니다.


이번 문제에서는 모르면 못 푸는 문제가 아닌가 싶습니다. ㅎㅎ...


그래도 큰 어려움은 없으니 풀어보도록 합시다.



 

 문제 이해


문제는 다음과 같습니다.

문제에서 md5('value', true)라고 나옵니다.

PHP의 md5 함수에서는 뒤에 boolean 옵션이 있습니다. 이 옵션은 기본적으로 false가 되어 있는데, 어째서인지 문제에서는 true로 작성해두었습니다.


문제로 들어가 소스를 확인해보았습니다.

<?php
 if (isset($_GET['view-source'])) {
  show_source(__FILE__);
  exit();
 }

 if(isset($_POST['ps'])){
  sleep(1);
  mysql_connect("localhost","md5_password","md5_password_pz");
  mysql_select_db("md5_password");
  mysql_query("set names utf8");
  /*
  
  create table admin_password(
   password char(64) unique
  );
  
  */

  include "../lib.php"; // include for auth_code function.
  $key=auth_code("md5 password");
  $ps = mysql_real_escape_string($_POST['ps']);
  $row=@mysql_fetch_array(mysql_query("select * from admin_password where password='".md5($ps,true)."'"));
  if(isset($row[0])){
   echo "hello admin!"."<br />";
   echo "Password : ".$key;
  }else{
   echo "wrong..";
  }
 }
?>
<style>
 input[type=text] {width:200px;}
</style>
<br />
<br />
<form method="post" action="./index.php">
password : <input type="text" name="ps" /><input type="submit" value="login" />
</form>
<div><a href='?view-source'>get source</a></div>


22번 라인에서는 싱글쿼터 우회를 방지하기 위해 real_escape가 걸려 있는 것을 볼 수 있습니다.

단, 23번 라인에서 우리가 입력한 값이 md5 함수에 들어가고 옵션이 true가 되어 있는 것을 볼 수 있습니다.

이 문제를 풀기 앞서 이 문제는 2010년에 플로리다 대학교에서 열린 Leet More CTF2010의 문제 중 하나입니다.


해당 참고 링크입니다.


http://cvk.posthaven.com/sql-injection-with-raw-md5-hashes




 

 문제 풀이


일단 이번 문제를 풀기 앞서 md5함수의 이해와 MySQL의 우회 방법에 대해 이해해야 합니다.


 

 md5('value', true) 이해


PHP의 md5함수의 bool 옵션은 기본적으로 false가 되어 있으나, true로 바뀔 경우 다음과 같은 변화가 있습니다.


md5('abcd', false) ==> e2fc714c4727ee9395f324cd2e7f331f

md5('abcd', true) ==> ��qLG'�$�.3


원래는 false의 경우처럼 hex로 된 값을 string으로 변환하여 반환해주는데, true 옵션을 넣어주게 되면, e2fc714c4727ee9395f324cd2e7f331f  hex값이 그대로 binary 형태로 보이게 됩니다. 


이해를 돕기 위해 다음과 같이 설명드리겠습니다.



 

 MySQL 우회


MySQL에서는 정상적인 조건문을 넣게 되면 당연하게도 정상적이게 실행됩니다.

select * from testtable where pw='abcd';


그러나 MySQL에서 만약 다음과 같이 조건문이 들어가게 되면 어떻게 되는지 알아보도록 하겠습니다.

select * from testtable where pw='abcd'='qwer';


이렇게 실행하게 되면 마치 아래의 쿼리와 같은 행동을 하게 됩니다.

select * from testtable where pw=0;


이는 'abcd'='qwer'이 거짓이기 때문에 0을 반환하게 되는 원리를 이용한 것입니다.


이해가 안 된다면 select 'abcd'='qwer'; 을 실행해보도록 합니다.



혹은 등호 말고도 or를 이용할 수도 있습니다.

select * from testtable where pw='abcd'or'1';


단 or 뒤에는 숫자가 나와야 합니다!!


이해가 되지 않는다면,

select 'adcd'or'1';

select 'abcd'or'a'; 

select 'abcd'or'1a';

select 'abcd'or'a1';

 각각 입력해보면 어떤 경우에 참인지 거짓인지 알 수 있습니다.




 

 위의 기법을 응용한 문제풀이


이제 위의 기법을 응용하여 문제를 풀어보도록 하겠습니다.

만약, md5() 해쉬로 나온 값에서 273d27 라는 값을 중간에 품고 있다면?


즉, 0x273d27 라는 값은 '=' 값입니다.


위의 값이 hash 중간에 들어가 있다면, binary를 그대로 출력해줄 때 ~~1~'='~~2~ 의 형태가 되게 됩니다.


그 말은 즉, select * from admin_password where password='~~1~'='~~2~' 의 형태로 쿼리가 만들어지게 되고, MySQL 우회 기법과 마찬가지로 문제가 풀리게 된다는 의미입니다.


이에 해당하는 값은 사실 브루트포싱을 통해 알아내야 합니다.


그런데 알아내는데 시간이 너무 오래걸립니다... ㅠㅠ


그래서 일단 저는 기존의 풀이대로 129581926211651571912466741651878684928 를 값으로 입력하였습니다.   


wargame.kr 포스트는 이해한 내용과 복습을 위한 목적으로 작성되었습니다.

이번 포스트에서는 fly_to_the_moon 문제에 대한 이해와 풀이를 진행해보도록 하겠습니다.


이번 문제에서는 앞서 소개드렸던 문제들보다 보다 추가적인 이해가 요구됩니다.


그래도 큰 어려움은 없으니 차근차근 설명해보도록 하겠습니다.



 

 문제 이해


문제는 다음과 같습니다.


문제에서는 javascript game이며, clear를 하거나 우회를하여 클리어하라고 말합니다.

저는 시간이 남아돌아서 게임좀 해보려는데 겁나 어렵더군요....


게임을 하다보면, 아래의 스코어와 재시작 버튼이 있는 것을 알 수 있습니다.

31337 스코어까지 어떻게 올리지... 하지 말고 fiddler를 켜서 문제를 살펴보도록 합시다.



 

 문제 풀이


문제에서 POST 데이터로 token과 score를 보내는 것을 볼 수 있습니다.

token은 주기적으로 바뀌는 인증데이터로 보이고, score는 우리가 조작해야 하는 값입니다.


그러나 아래와 같이 유효하지 않은 token을 가지고 score를 전송하면 토큰 에러를 뱉어냅니다.


토큰은 주기적으로 GET 메소드 형태로 응답이 돌아오게 됩니다.


때문에 토큰이 도착했다! 싶으면 바로 거기에 맞춰서 POST 형태의 데이터를 조작하여 보내주도록 합니다.



이로 인해 문제가 풀리게 됩니다.



wargame.kr 포스트는 이해한 내용과 복습을 위한 목적으로 작성되었습니다.

이번 포스트에서는 WTF_CODE 문제에 대한 이해와 풀이를 진행해보도록 하겠습니다.


근데, 문제 풀이의 이해는 딱히 없는 것 같고, 풀이만 있을 것 같습니다.


이 문제는 그냥 패킷 캡처 툴 혹은 프록시 툴을 다룰줄 아느냐에 대한 문제 같습니다.


 

 문제 이해


문제는 다음과 같습니다.


문제에서는 이것은 새로운 형태의 프로그래밍 언어라며, 이 코드를 읽을 수 있는지에 대해 물어보고 있습니다.

대체 무슨 코드길래...


문제 사이트에 들어가 source_code.ws를 다운받으니 다음과 같은 코드가 보입니다.


이를 보아하니 난독화 기법으로 작성된 코드의 일종으로 보입니다.


ws 확장자가 뭔지 알아봐야겠습니다.



 

 문제 풀이


ws 확장자는 따로 없는 것 같고, 아마 whitespace 의 약자가 아닌가 싶습니다.

구글링을 통해 whitespace 언어 혹은 whitespace code decoder 라고 작성해보았습니다.

해당 페이지에 들어가 코드를 붙여넣고 [Run]을 해보니 문제가 풀렸습니다.




wargame.kr 포스트는 이해한 내용과 복습을 위한 목적으로 작성되었습니다.

이번 포스트에서는 login_filtering 문제에 대한 이해와 풀이를 진행해보도록 하겠습니다.


이번 문제에서는 앞서 소개드렸던 문제들보다 심도 있는 이해가 요구됩니다.


큰 어려움은 없으니 차근차근 설명해보도록 하겠습니다.



 

 문제 이해


문제는 다음과 같습니다.

문제에서는 계정이 있는데, 블록되어 막혔다고 합니다.

이를 우회하여 들어갈 수 있는지 물어보는 문제입니다.


문제로 들어가 소스를 확인해보았습니다.

<?php

if (isset($_GET['view-source'])) {
    show_source(__FILE__);
    exit();
}

/*
create table user(
 idx int auto_increment primary key,
 id char(32),
 ps char(32)
);
*/

 if(isset($_POST['id']) && isset($_POST['ps'])){
  include("../lib.php"); # include for auth_code function.

  mysql_connect("localhost","login_filtering","login_filtering_pz");
  mysql_select_db ("login_filtering");
  mysql_query("set names utf8");

  $key = auth_code("login filtering");

  $id = mysql_real_escape_string(trim($_POST['id']));
  $ps = mysql_real_escape_string(trim($_POST['ps']));

  $row=mysql_fetch_array(mysql_query("select * from user where id='$id' and ps=md5('$ps')"));

  if(isset($row['id'])){
   if($id=='guest' || $id=='blueh4g'){
    echo "your account is blocked";
   }else{
    echo "login ok"."<br />";
    echo "Password : ".$key;
   }
  }else{
   echo "wrong..";
  }
 }
?>
<!DOCTYPE html>
<style>
 * {margin:0; padding:0;}
 body {background-color:#ddd;}
 #mdiv {width:200px; text-align:center; margin:50px auto;}
 input[type=text],input[type=[password] {width:100px;}
 td {text-align:center;}
</style>
<body>
<form method="post" action="./">
<div id="mdiv">
<table>
<tr><td>ID</td><td><input type="text" name="id" /></td></tr>
<tr><td>PW</td><td><input type="password" name="ps" /></td></tr>
<tr><td colspan="2"><input type="submit" value="login" /></td></tr>
</table>
 <div><a href='?view-source'>get source</a></div>
</form>
</div>
</body>
<!--

you have blocked accounts.

guest / guest
blueh4g / blueh4g1234ps

-->


25번 라인과 26번 라인을 보니 id, pw에는 real_escape 필터링이 되어 있어 싱글쿼터가 먹히질 않습니다.

그 말은 즉슨 sql injection을 하는 길을 모두 막아뒀다는 것입니다.


또 다른 필터링은 눈에띄지 않습니다.


다만 우리가 사용할 수 있는 계정은 guest/guest와, blueh4a/blueh4g1234ps라는 것입니다.



 

 문제 풀이


이번 문제에서는 코드를 보고 어떻게 우회할지 고민하는 문제입니다.

따라서 피들러를 사용할 필요가 없습니다.


원래는 피들러와 같은 툴로 이것저것 찔러봐야 알 수 있지만, 여기서는 삽질의 과정을 제외하고 풀이 과정만 작성해보려 합니다.


문제 풀이에 앞서, PHP와 MySQL 사이의 통신을 살펴보도록 하겠습니다.


 

 PHP와 MySQL의 대소문자 구분


PHP에서는 대소문자를 기본적으로 구분하여 인식합니다.


그 말은 즉, 우리가 Guest, gUest 등으로 입력하게 되면 PHP는 대소문자를 구분하기 때문에 guest라는 값과 다르게 인식한다는 것입니다.


그러나, MySQL은 기본적으로 대소문자를 구분하지 않습니다.


즉, 우리가 Guest를 입력하든, gUest를 입력하든 모두 같은 guest로 인식한다는 것입니다.


이러한 이유로 다음과 같은 경우의 쿼리 결과 값이 같아지기도 하는 현상이 발생합니다.


select * from testtable where id like 'a%';

select * from testtable where id like 'A%';


위의 like문에서 a와 A는 전혀 다른 값이지만, MySQL에서는 같은 값으로 인식합니다.



 

 대소문자 구분을 통한 우회


누구는 대소문자를 구분하고, 누구는 대소문자를 구분할 수 없는 이런 아이러니함을 이용하여, 이번 문제를 풀어보려 합니다.


위의 소스에서 PHP에서는 대소문자를 구분하여 블록된 아이디를 입력하면, 블록처리를 하게 됩니다.


그렇다면 여기서 guest 대신 Guest를 입력하게 되면 일단, PHP는 우회가 가능합니다.


또한 Guest라는 값은 MySQL에 들어갈 때 guest와 동일한 값으로 인식되기 때문에 쿼리는 다음과 같이 변하게 됩니다.


select * from user where id='guest' and ps=md5('guest');


이로 인해 문제가 풀리게 됩니다.



wargame.kr 포스트는 이해한 내용과 복습을 위한 목적으로 작성되었습니다.

이번 포스트에서는 flee_button문제에 이어 qr_code_puzzle 문제에 대한 이해와 풀이를 진행해보도록 하겠습니다.


이번 문제도 마찬가지로 문제 풀이의 이해는 딱히 없는 것 같고, 풀이만 있을 것 같습니다.


이 문제는 그냥 패킷 캡처 툴 혹은 프록시 툴을 다룰줄 아느냐에 대한 문제 같습니다.


 

 문제 이해


문제는 다음과 같습니다.


문제에서는 Javascript를 이용하여 만들어진 QR코드 퍼즐을 풀 수 있는지에 대해 물어보고 있습니다.

문제 내용만으로는 파악할 수 있는 것이 없으니 문제 사이트에 들어가보도록 합시다.


문제 사이트에 들어가보니 위와 같이 꽈져 있는 QR 코드를 볼 수 있습니다.

이걸 일일이 푸는 것도 방법이겠지만 굉장히 즐거운 시간이 아닐 수 없게 될 것 같습니다. 하하..



 

 문제 풀이


이 문제에 대한 풀이 방법은 두 가지 입니다.


 

 이미지 위치 확인하기


먼저 QR 코드 이미지가 어디서 나타난 것인지 확인하는 방법입니다.



위의 이미지에서는 현재 페이지의 하위 디렉토리인 img 디렉토리의 qr.png 파일이 있다고 합니다.

해당 루트로 들어가면 이미지가 나타납니다.



 

 개발자 모드에서 이미지 확인


위의 방법과 거의 동일하지만, 이미지를 찾기 위해 개발자모드를 이용할 수 있습니다.

개발자모드(F12) -> [Sources] -> 폴더를 쭉 살피다보면 이미지가 나타남




wargame.kr 포스트는 이해한 내용과 복습을 위한 목적으로 작성되었습니다.

이번 포스트에서는 already_got 문제에 이어 flee_button에 대한 이해와 풀이를 진행해보도록 하겠습니다.


근데, 문제 풀이의 이해는 딱히 없는 것 같고, 풀이만 있을 것 같습니다.


이번 문제는 인터넷 브라우저의 개발자모드를 사용할 수 있는지, 혹은 소스를 볼 수 있는지 등의 여부를 확인하는 문제인 것 같습니다.


 

 문제 이해


문제는 다음과 같습니다.

문제에서는 버튼을 클릭할 수 있는지에 대한 여부를 물어보고 있습니다.

처음에는 간단히 버튼 클릭이 안 되도록 막아놨구나, 특정한 코드를 지우면 되려나? 하며 문제에 접근했지만 생각보다 웃긴 모습을 보게 되었습니다.


자세한 건 문제풀이에서 보도록 하겠습니다.



 

 문제 풀이


이번 문제에서는 fiddler를 사용할 게 없습니다. 바로 개발자모드를 들어가줍니다.


개발자모드는 인터넷 브라우저를 키고 F12를 클릭하면 들어가집니다.


문제를 들어가면 위와 같이 마우스 위치와 조금 떨어진 곳에 버튼이 나타나 있습니다.

백날 쫒아가봐야 절대 클릭 안 될 거 같습니다. 저는 못 쫒아갔습니다.


일단 버튼을 클릭한다는 건, 버튼이 클릭됐을 때의 동작이 있다는 것입니다.


개발자모드로 어떤 행위가 버튼에 기록되어 있는지 확인해보도록 합니다.



보아하니, 버튼을 클릭하면 GET 메소드 형태로 key=0e35와 같은 쿼리를 전송하도록 되어 있습니다.

그러면 버튼을 클릭한 것처럼 동작되도록 하려면, ?key=0e35를 주소창에 덭붙여주도록 합니다.





wargame.kr 포스트는 이해한 내용과 복습을 위한 목적으로 작성되었습니다.

이번 포스트에서는 already_got 문제에 대한 이해와 풀이를 진행해보도록 하겠습니다.


근데, 문제 풀이의 이해는 딱히 없는 것 같고, 풀이만 있을 것 같습니다.


이 문제는 그냥 패킷 캡처 툴 혹은 프록시 툴을 다룰줄 아느냐에 대한 문제 같습니다.


 

 문제 이해


문제는 다음과 같습니다.



문제에서는 HTTP Response header를 볼 수 있는지에 대해 물어보고 있습니다.

이 말은 즉, HTTP 요청을 보내고 응답으로 돌아오는 데이터의 헤더를 볼 수 있는지에 대한 질문입니다.


이러한 값을 보기 위해서는 프록시 툴을 사용하거나, 패키을 통째로 볼 수 있는 툴을 쓰거나 등의 방법이 있습니다.


저는 wargame.kr의 풀이를 진행하기 위해 기본적으로 fiddler라는 프로그램을 사용할 것입니다.



 

 문제 풀이


먼저 fiddler를 키고, 문제에 해당하는 페이지를 들어갑니다.

그렇게 하면, 다음과 같이 패킷이 캡처가 됩니다.


여기서 먼저 캡처된 패킷을 클릭한 후, [Inspector]를 클릭하고 요청 영역(위쪽)과 응답 영역(아래쪽)의 설정을 모두 [Raw]로 맞춰 봅니다.


Header를 보기 위해서는 저는 아무래도 Raw가 편하더라고요.ㅎㅎ


그렇게 하면 위와 같은 값이 나타나게 됩니다.


위에서는 FLAG : 뭐시기뭐시기 라는 값이 나타나 있는 것을 확인할 수 있습니다.




+ Recent posts