달력

4

« 2024/4 »

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
2020. 10. 1. 16:41

천천히 다시 시작해보자. Just2020. 10. 1. 16:41

어떻게 시작한담..!?

:
Posted by einai
2017. 8. 7. 17:29

[문제풀이] Nebula, Level16 Wargames/e-exercises.com2017. 8. 7. 17:29

※ LEVEL 16


Q. There is a perl script running on port 1616.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#!/usr/bin/env perl
 
use CGI qw{param};
 
print "Content-type: text/html\n\n";
 
sub login {
  $username = $_[0];
  $password = $_[1];
 
  $username =~ tr/a-z/A-Z/# conver to uppercase
  $username =~ s/\s.*//;        # strip everything after a space
 
  @output = `egrep "^$username" /home/flag16/userdb.txt 2>&1`;
  foreach $line (@output) {
      ($usr$pw= split(/:/$line);
  
 
      if($pw =$password) {
          return 1;
      }
  }
 
  return 0;
}
 
sub htmlz {
  print("<html><head><title>Login resuls</title></head><body>");
  if($_[0== 1) {
      print("Your login was accepted<br/>");
  } else {
      print("Your login failed<br/>");
  }    
  print("Would you like a cookie?<br/><br/></body></html>\n");
}
 
htmlz(login(param("username"), param("password")));
cs



A. 이번 문제는 명령어 인젝션 문제이다. 

이전에도 구동중인 서비스에 명령어 인젝션하는 문제가 있었는지는 가물가물하지만, 인젝션 문제는 자주 나왔던거 같다. 가벼운 트릭 하나만 쓰면 쉽게 풀리는 문제니까 바로 문제풀이 들어가도록 하겠다. 


[그림 1] 실행 파일 작성


flag16 계정이 접근할 수 있는 위치에 파일을 생성한 뒤 other 권한에 실행 권한을 부여한다. 우리는 명령어 인젝션을 할 것이니까~~!


[그림 2] 명령어 인젝션


명령어를 실행시키기 위해 ` 문자로 감싸고 경로에 별표를 삽입하여 모든 경로를 탐색할 수 있게 한다. 

요것이 바로 트릭이라면 트릭~ 사전에 이 문자의 기능을 알고 있었다면 쉽게 풀었을 것이다 :)


[그림 3] 플래그 획득



플래그 획득~ 






:
Posted by einai
2017. 7. 25. 20:56

[문제풀이] Nebula, Level15 Wargames/e-exercises.com2017. 7. 25. 20:56

※ LEVEL 15


Q. 

strace the binary at /home/flag15/flag15 and see if you spot anything out of the ordinary.


You may wish to review how to “compile a shared library in linux” and how the libraries are loaded and processed by reviewing the dlopen manpage in depth.


Clean up after yourself :)



A. 이 문제는 라이브러리를 로드하는 순서의 우선 순위를 이용하는 문제이다. 

이번 문제는 차근차근 확인해보도록 하겠다. 


[그림 1] 문제 실행 화면


문제에서 주문한 바와 같이 strace 명령어를 이용하여 프로그램의 상태를 확인해보았다. 참고로 strace 명령어는 간단히 말하자면 시스템 함수 호출과 시그널을 추적하는 툴이다. 


[그림 1]에서 보는 바와 같이 "libc.so.6"을 open 함수의 인자 값으로 설정하여 호출하지만 계속 실패하게 된다. 


[그림 2] objdump 명령어로 섹션 확인 


objdump 명령어를 통해 문제를 확인해보면 RPATH 가 설정되어 있는 것을 알 수 있다. 이 RPATH는 실행 파일이나 라이브러리에 런타임 시 필요한 라이브러리를 찾기 위해 설정해 놓는다(필수 설정 값은 아님). 


단, 해당 설정을 해놓으면 /lib, /usr/lib 과 같은 표준 라이브러리 경로를 검색하기에 앞서 RPATH로 설정한 경로를 검색한다. 그럼 이제 우리는 동일한 라이브러리 이름을 갖는 라이브러리를 만들어 해당 문제에서 사용하는 함수의 이름을 사용하여 함수를 만들 것이다.  


[그림 3] 라이브러리 코드


[그림 3]을 컴파일하여 라이브러리로 만들 것이다. 간단히 소스코드 내용을 말하자면 생성자를 활용하여 메인 함수보다 먼저 실행하도록 하였고 이는 system 함수를 호출한다. 물론 문제에서 동작하는 다른 함수를 대체해도 문제가 될 것은 없으나 좀 더 번잡스러워진다. 그 이유는 선택한 함수가 실행되기 전까지의 모든 함수를 라이브러리에 만들어줘야 하기 때문이다. 같은 이유로 __cxa_finalize 함수가 선언되었다. 


아래의 [그림 4]는 __cxa_finalized 함수가 선언되기 전에 발생한 에러 메시지이다. 단순 참고용 !


[그림 4] 에러 구문 


[그림 5] 컴파일 후 문제 실행 


마지막으로 해당 위치에 libc.so.6 이름의 라이브러리 파일을 생성한 뒤 문제를 실행하면 쉘을 획득할 수 있다. 



:
Posted by einai