본문 바로가기
  • Show the world what you can do
Web2/LoS

[LoS] goblin 풀이

by kaymin 2022. 11. 5.

먼저 문제 코드는..

<?php 
  include "./config.php"; 
  login_chk(); 
  $db = dbconnect(); 
  if(preg_match('/prob|_|\.|\(\)/i', $_GET[no])) exit("No Hack ~_~"); 
  if(preg_match('/\'|\"|\`/i', $_GET[no])) exit("No Quotes ~_~"); 
  $query = "select id from prob_goblin where id='guest' and no={$_GET[no]}"; 
  echo "<hr>query : <strong>{$query}</strong><hr><br>"; 
  $result = @mysqli_fetch_array(mysqli_query($db,$query)); 
  if($result['id']) echo "<h2>Hello {$result[id]}</h2>"; 
  if($result['id'] == 'admin') solve("goblin");
  highlight_file(__FILE__); 
?>

인데..보면 '나 " 이 문자를 쓸 수 없게 되어있다. 그러니 뒤에 id='admin'으로 하지 못한다는 뜻...

근데 처음에 no=1을 넣어보니까

Hello guest

라고 뜨고, no=100나 다른 숫자를 넣어보니 아무 문구도 뜨지 않았다. 그래서 no.1이 guest구나~ 싶었고 그럼 id='admin'의 no를 찾으면 되지 않을까? 싶어서 no=0 or no=1을 넣어보니 똑같이 guest가 떴고,

admin의 no가 guest랑 그리 멀지 않을 것 같아 no=0 or no=2 했더니..

성공..?

ㅇㅣ런 때려맞추기로 맞아버렸네..

맞았는데 맞다고 하기 애매하게 맞았다. 하도 이상해서 인터넷에 따로 검색해보니

no=0 or id=0x61646d696e 라고 해야지 맞는다고..

0x61646d696e는 문자 admin을 16진수로 돌렸을때 나오는 값이다. 즉 그냥 admin은 기계어로 취급되는 글자이고, 0x61646d696e이자 문자열로서의 'admin'은 문자로 취급되는 글자인 것이다. (사실은 잘 모르지만 아마 그런 것 같다..)

그렇기에 따옴표로 admin이 문자임을 표시를 못한다면 숫자로 표시할 수 있는것! 결국 우리가 쓰는 모든 문자가 숫자이기 때문이다.

 

그래서 결국 풀긴 풀었지만..내가 푼 방식은 풀었다기보단 어쩌다 된거같고 정답풀이는 문자열 admin을 16진수로 표현해서 쿼리에 넣는것이다!!

'Web2 > LoS' 카테고리의 다른 글

[LoS] troll 풀이  (0) 2022.11.10
[LoS] orge 풀이  (0) 2022.11.10
[LoS] wolfman 풀이  (0) 2022.11.10
[LoS] orc 풀이  (0) 2022.11.10
[LoS] cobolt 풀이  (0) 2022.11.05

댓글