UPX

해킹/개념 정리 2015. 11. 24. 20:24

UPX(Ultimate Packer for eXecutables)는 여러 운영체제에서 수많은 파일 포맷을 지원하는 오픈 소스 실행 파일 압축 프로그램이다. GNU 일반 공중 사용 허가서를 통해 공개된 자유 소프트웨어이다. 압축, 압축 해제의 기능을 모두 담당한다.



UPX는 압축 해제를 위해 두 개의 메커니즘을 지원한다.

  1. 인 플레이스(in-place) 테크닉
  2. 임시 파일로의 해제

실행 파일을 메모리로 해제하는 인 플레이스 테크닉은 모든 플랫폼에서 이용이 가능한 것은 아니다. 나머지 플랫폼에서는 임시 파일로의 압축 해제를 사용한다. 이 과정에는 추가적인 오버헤드와 기타 단점들이 동반되지만, 어떠한 실행 파일 포맷도 압축이 가능하게 한다.

임시 파일로 해제는 방식은 몇 가지 단점이 존재한다:

  • suid와 같은 특수 권한이 무시된다.
  • argv[0]의 의미가 없어진다.
  • 여러 인스턴스로 실행 중인 실행 프로그램들은 공통된 세그먼트를 공유할 수 없다.

수정되지 않은 UPX 압축이 자주 발견되며 바이러스 검사 소프트웨어 스캐너를 통해 압축이 해제된다. UPX 또한 이미 압축된 미수정 실행 파일들의 압축을 해제할 수 있는 기능이 자체 내장되어 있다.



UPX로 압축된 바이너리가 실행되는 대략적인 원리는 실제 실행코드를 data영역에 압축해서 넣고 EP부분에 코드의 복구/실행을 하는 루틴을 넣는 것이라고 합니다. 


이러한 패킹 소프트웨어들은 대부분 패킹과정에서 디버깅을 감지하고 차단하는 기능을 추가한다고 합니다.

'해킹 > 개념 정리' 카테고리의 다른 글

ASLR의 개념  (0) 2016.01.13
함수의 프롤로그와 에필로그에 관한 고찰 + fake ebp(실패)  (0) 2016.01.13
다중 파이프 페이로드  (0) 2015.11.24
GOT overwrite  (0) 2015.11.24
file destriptor  (0) 2015.11.24
Tags
Social

Toddler's Bottle - bof

2015. 11. 24. 20:04

Please enter a vaild password to see the contents.

Toddler's Bottle - fd

2015. 11. 24. 18:09

Please enter a vaild password to see the contents.

file destriptor

해킹/개념 정리 2015. 11. 24. 18:02

컴퓨터 프로그래밍 분야에서 파일 서술자(file descriptor) 또는 파일 기술자는 특정한 파일에 접근하기 위한 추상적인 키이다. 이 용어는 일반적으로 POSIX 운영 체제에 쓰인다. 마이크로소프트 윈도와 C 표준 입출력 라이브러리환경에서 "파일 핸들"(file handle)이라는 말이 선호되지만 후자의 경우 기술적으로 다른 객체이다.

POSIX에서 파일 서술자는 정수, 곧 C형 int를 말한다. 모든 프로세스가 갖추어야 하는 표준 POSIX 파일 서술자는 다음과 같이 세 개가 있다


출처:https://ko.wikipedia.org/wiki/%ED%8C%8C%EC%9D%BC_%EC%84%9C%EC%88%A0%EC%9E%90

'해킹 > 개념 정리' 카테고리의 다른 글

ASLR의 개념  (0) 2016.01.13
함수의 프롤로그와 에필로그에 관한 고찰 + fake ebp(실패)  (0) 2016.01.13
다중 파이프 페이로드  (0) 2015.11.24
GOT overwrite  (0) 2015.11.24
UPX  (0) 2015.11.24
Tags
Social

nebula_level09

해킹/시스템 2015. 11. 7. 03:05

nebula_level09 포스팅입니다.


flag09파일 의 php 소스인듯 합니다.

argv[2]를 통해 markup 함수로 들어가는 use_me 변수를 사용해서 공격하는게 확실해 보입니다.

변수 이름이 use_me 이니까요.


사실 php에 전혀 익숙하질 않아서 슬래시 역슬래시가 마구잡이로 섞여있는 코드를 보면서 머리가 참 아팠습니다.

preg_replace는 문자열에서 패턴으로 검출한 부분을 변경해 주는 함수입니다.

markup 함수 안쪽에 이 함수게 세번 호출되는데 뒷쪽에 두번은 코드를 직접 주입할 수 없게 [, ] 를 바꿔주는 일반적인 기능인 것으로 보입니다만 처음 호출되는 preg_replace가 어딘가 취약해 보입니다.

$filename을 통해 전달된 해당 파일의 내용이 $contents 안으로 들어가고 그것을 변경해주는데

"[email" 뒤에 부분을 "]"를 만날때 까지 spam("\2")로 바꿔준다는 내용입니다.(가독성을 위해 \를 빼줫습니다.)

\2가 무슨뜻인지 몰라 잠시 헤맸지만 ()를 두번째 만나는 부분이라는 뜻이란 걸 알아냈습니다. 즉 email이라는 문자 뒤에 나오는 것들을 집어다 넣겠다는 뜻이군요. /e는 앞의 문자열이 php코드라는 뜻이라고 합니다.




tmp밑에 level09.txt를 생성해서 저렇게 만들어주고 argv[1]으로 level09.txt의 경로를, argv[2]로 /bin/bash를 넣어줘봤습니다.




그대로 /bin/bash를 뱉어내기만 할 뿐 실행되지는 않습니다.

system(bin/bash), exec(/bin/bash) 어떻게 넣어봐도 코드로 인식하지 않는지 그냥 그대로 뱉어버립니다.

여기서 1차 멘붕이 왔습니다...


 그러던 중에 http://www.madirish.net/node/437에서 재밌는 자료를 찾았는데





짧은 영어이지만 해석해보니 flag가 있을 경우 php 함수가 변수에 있는 문자열을 찍는 것이 아니라 함수를 직접 실행켜 phpinfo를 불러오는 오류가 있다는 내용이었습니다.

그런데 위의 시도에서는 코드가 실행되지 않고 정상적으로 뱉어냈을까요?? 해당 문서의 전문을 읽어보니 spam함수의 괄호 안에 ("") 이런식으로 따옴표가 들어가 있기 때문인 것 같습니다. 위 문서의 경우에는 strtoupper("\\1")이렇게 했더니 정상적으로 대문자로 바꾸는 기능을 수행했으나 strtoupper(\\1)이렇게 따옴표가 없을 때 함수이름까지 출력되었거든요.. 이부분을 우회하기 위해서 level09.txt를 바꿔야 했습니다.

또 이것저것 뒤져보다 정규표현식에서 \\2와 {$2}가 혼용될 수 있다는 정보를 찾았고 그부분을 이용하기로 했습니다. \\2로 사용될 경우 spam("")안에서 결국 문자열로 취급 될 뿐이라서요.




여러가지로 시도를 해본 결과 level09.txt를 [email {${`$use_me`}}]로 바꿔준후...






쉘이 떴습니다!! 근데 getflag를 제대로 실행하지도 못하고 exit를 받고 나서야 안된거라고 뱉어내는 이상한 삐꾸 쉘이 떴네요...ㅎㅎ





쉘을 띄워주는 소스를 짠 후 gcc 명령어로 컴파일을 시켜 아웃풋을 뱉도록 해봐야 겠습니다.

argv[1]로 uid를 넣도록 해놨습니다.





./flag09 /tmp/level09.txt "gcc -o /home/flag09/getshell_id /tmp/getshell_id.c; chmod 7777 /home/flag09/getshell_id" 이런 명령으로 컴파일을 했더니 성공적으로 getshell_id가 생성되었습니다.

중간에 명령어를 바보같이 입력해서 캡쳐가 지저분해지긴 했으나... 결국 getflag 실행에 성공했군요.

솔직히 php를 거의 모르는 상황에서 맨땅에 헤딩하는 경우이고 시스템보다는 웹쪽 내용인 것 같아 넘어가고 싶기도 했으나 어쩐지 풀릴듯 풀릴듯 싶어 계속 잡고있게 만드는 문제였네요... 정말 오래걸렸습니다.



끝-






'해킹 > 시스템' 카테고리의 다른 글

Codegate CTF 2016 - oldschool  (0) 2016.03.22
Codegate CTF 2016 - miccheck  (0) 2016.03.21
nebula_level08  (0) 2015.11.06
nebula_level06  (1) 2015.11.04
nelbula_level05  (1) 2015.10.29
Tags
Social

nebula_level08

해킹/시스템 2015. 11. 6. 17:37

nebula level08 포스팅입니다.



level08 문제는 패킷을 캡쳐한 pcap파일입니다.

VIDOQ님 포스팅을 보니 칼리리눅스에서 옮기셨던데 저는 칼리리눅스 받아놓은게 없어 윈도우로 옮겨보았습니다.


xshell을 사용하고 있는데 권한상 바로 파일을 옮기지는 못하고scp를 사용해 우분투로 옮겨서 다시 윈도우로 옮겼습니다.

scp -P 22 ./capture.pcap root@IP:/root

scp 존재를 모르고 있었는데 덕분에 명령어 하나 알아가네요

scp란 로컬호스트와 원격 호스트간의 파일전송을 해주는 ssh기반 전송이라고 합니다.

secure copy라고 하네요



와이어 샤크에서 이 pcap파일을 연후 TCP stream 기능으로 보면 패스워드가 바로 노출됩니다.

이 기능은

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

If you are working with TCP based protocols it can be very helpful to see the data from a TCP stream in the way that the application layer sees it. Perhaps you are looking for passwords in a Telnet stream, or you are trying to make sense of a data stream. Maybe you just need a display filter to show only the packets of that TCP stream. If so, Wireshark’s ability to follow a TCP stream will be useful to you. 출처:https://www.wireshark.org/docs/wsug_html_chunked/ChAdvFollowTCPSection.html

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

TCP를 application layer에서 보는대로 나타내주는 기능이라고 합니다.


백스페이스 7f를 감한한 패스워드는 backd00Rmate




끝-

'해킹 > 시스템' 카테고리의 다른 글

Codegate CTF 2016 - miccheck  (0) 2016.03.21
nebula_level09  (0) 2015.11.07
nebula_level06  (1) 2015.11.04
nelbula_level05  (1) 2015.10.29
nebula_level04  (0) 2015.10.28
Tags
Social

rev task9 문제

해킹/리버싱 2015. 11. 6. 15:30


키를 체크하는 알고리즘을 ida에서 디컴파일한 모습입니다.

입력값을 byte[5][4]라고 생각하고 행끼리 더해준 값이 0xdeadbeef로 나오면 되는 간단한 알고리즘입니다.

체크 알고리즘에 bp를 걸고 우회해 보았으나 플래그를 출력하는 과정에서 입력값을 사용하기에 아마 0xdeadbeef를 만들어주는 입력값을 실제로 입력해야 하는 것 같습니다.




(python -c 'print "\x01\x01\x01\x01"*4+"\xeb\xba\xa9\xda"';cat)|./task9_x86_64_46d01fe312d35ecf69c4ff8ab8ace75d080891dc


0x00을 넣을 수 없기 때문에 파이썬 스크립트와 파이프를 이용해서 0x01 네바이트를 네번 넣어준 후 0xdeadbeef-0x04040404을 넣어주니 플래그가 출력되었습니다.



'해킹 > 리버싱' 카테고리의 다른 글

gdb 한글 메뉴얼  (0) 2019.01.24
incognito - insideout  (0) 2015.10.21
Tags
Social