• git clone http://github.com/longld/peda.git ~/peda
  • echo "source ~/peda/peda.py" >> ~/.gdbinit

'Study > 기타' 카테고리의 다른 글

gdb peda 설치 방법  (0) 2019.10.31
No such file or directory 해결 방법  (0) 2019.10.31
파워셸(powershell)  (0) 2019.10.17
PEDA GDB 명령어  (0) 2019.10.12
우분투 저장소 변경 방법  (0) 2019.10.12

 

문제 발단

바이너리를 실행하기 위해 실행 권한을 준 다음 실행하였으나 위와 같이 파일과 디렉터리가 아니라는 에러를 확인할 수 있다.

 

문제 확인

이는 실행할 파일과 현재 환경의 CPU 포맷이 달라서 발생하는 오류로 lscpu라는 명령어로 확인할 수 있다.

현재 환경의 경우 64bit Architecture를 가지고 있으나 아래의 바이너리의 경우 32bit 실행 파일이므로 현재의 환경과 맞지 않아 실행이 되지 않는다.

 

문제 해결

sudo apt-get install libc6-i386

64bit 환경에서도 32bit 프로그램을 실행할 수 있는 라이브러리를 설치하면 된다.

'Study > 기타' 카테고리의 다른 글

gdb peda 설치 방법  (0) 2019.10.31
No such file or directory 해결 방법  (0) 2019.10.31
파워셸(powershell)  (0) 2019.10.17
PEDA GDB 명령어  (0) 2019.10.12
우분투 저장소 변경 방법  (0) 2019.10.12

 

[파일 확인]

64bit ELF 파일이며, 정적으로 링크되어 있고 심볼 정보가 존재한다.

 

[문제 확인]



바이너리 자체는 매우 간단하다. 인자로 입력받은 값이 숫자이며 해당 숫자는 임의의 문자열로 네이밍되어 있는 함수들의 조건을 모두 만족시키면 되는 것으로 판단된다.

 

임의의 문자열로 네이밍되어 있는 함수의 일부를 확인한 결과는 다음과 같다.

임의로 입력할 문자열이 20자리이며, a1[15] - a1[4] == 10이되는 조건이며, 여기서 48을 마이너스 해주는 이유는 아스키 테이블에서 0x30이 아스키 값 0을 가리키는데 숫자로 인식시키기 위해서 48(0x30)만큼 빼주어야 한다.

 

이외의 함수도 위와 유사하여 이에 따라 총 20개의 방정식이 생성된다.  20개의 방정식을 풀기 위해 방정식의 해를 찾아주는 SMT solver 라이브러리인 z3-solver를 이용하였다.

 

SMT의 경우 Satisfiability Modulo Theories의 약자로 수식을 만족하는 값이 존재하는지를 찾아준다. 이를 가능하게 하는 z3의 경우 Microsoft에서 만든 것으로 수식 해석 도구로 방정식과 같은 요소들의 해결을 가능하게 해준다.

 

...추가 작성 예정

'CTF & Wargame > etc' 카테고리의 다른 글

2017 Bugs bunny Rev 150  (0) 2019.10.28
2017 Bugs Bunny Rev100  (0) 2019.10.27
GandCrab Detection  (0) 2019.08.04

 

[메인 함수 확인]

메인 함수를 확인한 결과 cdecl 호출 규약을 사용하는 것을 확인할 수 있고, 소스 중 i_am_debugged() 함수를 확인한 결과 아래와 같이 안티 리버싱 기술이 적용되어 있는 것을 확인할 수 있다.

 

ptrace를 사용하여 자기 자신에게 디버거, 트레이서 등이 붙어 있을 경우 0을 리턴한다. 이를 우회하기 위해서는 바이너리에서 해당 함수에 대해 리턴 값을 0으로 변경하도록 패치하면 된다.

 

핵심 구문을 확인한 결과 단순히 C[i] = C[i] + (A[i] ^ B[i]) 연산을 진행하고 있다.

 

A
B

 

[코드]

 

[결과]

 

 


[기타 정리]

ptrace는 리눅스, 유닉스 환경에서 프로세스 디버깅에 사용되는 함수이자 시스템 콜이다.

디버깅 용도로 사용되며 디버거는 일종의 ptrace 명령어 묶음 유틸리티라 볼 수 있다.

lib.so에서 ptrace를 export 하며 실제로는 ptrace라는 커널 시스템 콜이 내부적으로 사용된다.

gdb나 frida의 경우에도 내부적으로 ptrace를 사용한다.

 

ptrace의 특징으로는 다양한 기능들을 함수 인자로 처리한다는 점이다.

ptrace(PTRACE_ATTACH, ... ); // process를 attach하겠다.

ptrace(PTRACE_GETREGS, ... ); // 대상 process의 레지스터 목록을 받아오라

ptrace(PTRACE_PEEKDATA, ... ); // 데이터를 쓰거나

ptrace(PTRACE_POPEDATA, ... ); // 데이터를 가져온다.

ㅇman ptrace 명령을 통해 다양한 기능을 확인할 수 있다.

 

ptrace(PTRACE_ATTACH,pid,0,0)과 같이 사용할 경우 프로세스 attach가 가능하며,

ptrace(PTRACE_DETACH,pid,0,0)과 같이 사용할 경우 프로세스 detach가 가능하다.

만약 프로세스가 attch 당했을 경우 해당 프로세스 stop 상태에 들어간다.

 

strace = systemcall trace이며 strace의 경우 프로그램이 커널과 상호 작용하는 모든 system call 내역을 보여주기에 프로그램의 크기가 크다면 결과량이 많아지기 때문에 필터링을 통해 해석하는 방법을 숙지해야 한다. syscall 위주로 작성되지 않고 알고리즘 위주로 작성된 프로그램의 경우 strace를 하여도 결과가 잘 나오지 않는다.

ltrace = library trace

 

straced와 ltrace의 경우 ptrace의 내부에서 사용하는 system call을 사용한다

 

64bit 시스템에서는 syscall의 인자를 RAX에 syscall number를 넣어 사용하며 ptrace의 경우 0x65가 인자로 들어간다.

 

[참조 사이트]

http://research.hackerschool.org/temp/ptrace.txt

https://jh4hj.tistory.com/entry/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8%EC%9D%84-%EB%8F%99%EC%A0%81%EC%9C%BC%EB%A1%9C-%EC%B6%94%EC%A0%81%ED%95%98%EB%8A%94-%EB%8F%84%EA%B5%AC

 

'CTF & Wargame > etc' 카테고리의 다른 글

2017 Bugs bunny Rev 150  (0) 2019.10.28
2017 Bugs Bunny Rev100  (0) 2019.10.27
GandCrab Detection  (0) 2019.08.04

[파워셸 실행]

파워셸을 실행하기 위해서는 "실행 정책"을 주어야하며, ps1과 같은 확장자로 하여 직접적으로 실행하는 것은 정책적으로 막혀있으며 그 예는 다음과 같다.

PS> .\test.ps1 // 실행할 수 없음

 

위와 같이 실행하기 위해서는 파워셸을 실행 이전에 "powershell.exe -ExecutionPolicy Bypass" 커맨드를 사용하여 파워셸을 실행시키면 위의

PS> .\test1.ps1가 실행 가능해지며 "powershell.exe -ExecutionPolicy Bypass .\test.ps1"과 같이 한 번의 커맨드로도 실행 가능하다.

 

[파워셸 실행 정책 우회]

  • 파워셸 콘솔안에 스크립트를 넣는 방법
PS> C:\Temp> Write-host "I would be conquer the Powershell."
I would be conquer the Powershell.
PS C:\Temp>

 

  • CMD 상에서 echo 명령으로 스크립트 내용을 작성하고 파이프로  파워셸 표준입력에 연결하는 방법
C:\Temp>echo Write-host "How can I conquer the Powershell?" | powershell.exe -noprofile -
How can I conquer the Powershell?
C:\Temp>

 

  • Get-Content로 스크립트를 읽어서 파이프로 파워셸 표준입력으로 연결하는 방법
PS C:\Temp> Get-Content .\test.ps1 | Powershell.exe -noprofile -
Path
----
C:\Users\RoyTravel\Desktop

PS C:\Temp>

※ test.ps1 파일의 내용은 "Get-Location" 입니다.

 

  • Type로 스크립트를 읽어서 파이프로 파워셸 표준입력으로 연결하는 방법
PS C:\Temp> Type .\test.ps1 | Powershell.exe -noprofile -
Path
----
C:\Users\RoyTravel\Desktop

PS C:\Temp>

 

  • URL을 통해 스크립트 다운로드하고 스크립트 호출 방식으로 실행하는 방법
PS C:\Temp> powershell.exe -nop -c "iex(New-Object Net.WebClient).DownloadFile('https://localhost/test.exe','C:/Temp/test.exe')"

 

위와 같은 방법을 사용하면 코드 한줄을 사용하여 다운로더를 구현할 수 있고, 이외에 실행하는 코드 한줄을 추가할 경우 외부로부터 다운로드하여 실행까지 가능하다.

 

  • -Command 옵션을 사용하는 방법

해당 방법은 간단한 스크립트를 실행하기 위해선 사용하기 좋으나, 복잡한 스크립트를 사용할 경우 파싱 에러 등을 유발할 수 있다. (-command의 단축 명령은 -c이다)

PS C:\Temp> Powershell.exe -command "Write-Host 'I will conquer the Powershell.'"
I will conquer the Powershell.
PS C:\Temp>

 

  • -EncodedCommand 옵션을 사용하는 방법

해당 방법은 "Command" 옵션을 사용하는 방법과 유사하나, 모든 스크립트는 유니코드/Base64로 인코킹된 문자열로 제공된다. 이 방식으로 스크립트를 인코딩할 경우 "Command" 옵션을 사용하게 되는 경우에 실행되는 귀찮은 구문분석 오류를 방지하는데 도움이 된다.

 

 

 

[개요]

파워셸의 경우 .NET Framework를 기반으로 만들어졌고, 이에 따라 객체 지향 스크립트로서 셸을 사용할 수 있다.

배시셸에서와 같이 기본적인 명령어들을 제공하듯 파워셸에서도 기본 명령어가 제공되며 이를 cmdlet이라 한다.

바이너리 형태로 동작하지 않으며 구체적인 기능을 제공하는 .NET 클래스고, 내부적으로 .NET Framwork Class Library를 이용하여 구현하였다.

 

> powershell Get-ExecutionPolicy

실행 정책을 보여주며 디폴트 값은 "Restricted"이며 이는 레지스트리에서 변경 함으로써 우회가 가능하며 이외에도 실행 정책을 우회할 수 있는 15가지 방법이 존재한다. Here

 

 

출처 : https://sanseolab.tistory.com/29

'Study > 기타' 카테고리의 다른 글

gdb peda 설치 방법  (0) 2019.10.31
No such file or directory 해결 방법  (0) 2019.10.31
파워셸(powershell)  (0) 2019.10.17
PEDA GDB 명령어  (0) 2019.10.12
우분투 저장소 변경 방법  (0) 2019.10.12


 명령어 (as)

 설명

run (r) 

 바이너리 실행

run [인자 1] [인자 2]

 인자 1과 인자 2를 인자로하여 프로그램을 실행

continue (c)

 다음 브레이크 포인트까지 실행 

quit (q)

 바이너리 종료 

disassemble (pdisas) [함수 이름]

 특정 함수의 어셈블리 코드를 출력 

info function (info func)

 특정 함수의 정보를 출력

info break delete

 모든 브레이크 포인트 제거

info break delete [digit]

 특정 브레이크 포인트 제거 

info reg

 레지스터 정보 출력 

break function

 함수에 브레이크 포인트 설정 

b *function

 특정 함수에 브레이크 포인트 설정 

b *[address]

 특정 주소에 브레이크 포인트 설정 

stepi (si)

 step into로, 어셈블리 코드를 한 줄 실행하며 함수를 만날 경우 해당 함수로 진입 

nexti (ni)

 next into로, 어셈블리 코드를 한 줄 실행하며 함수를 만날 경우 해당 함수의 실행이 완료

print [function name]

 해당 함수의 주소를 출력 

print $reg (p $reg)

 해당 레지스터 값을 출력

p / [출력형식] [변수명]

 출력 형식에 맞추어 변수 값 출력

x/[범위]i [주소] 

 특정 주소를 범위만큼 어셈블리로 출력 

x/[범위]s [주소]

 특정 주소를 범위만큼 문자열로 출력

 x/[범위]wx [주소]

 특정 주소 범위만큼 4바이트 단위로 출력 

set {type} [주소]

 특정 메모리에 값을 지정 ex) set {int}0x8048000 = 100 

set $[reg]

 특정 레지스터에 값을 지정 ex) set $eip = 0x41414141 

set disassembly-flavor intel

 어셈블리어를 인텔 형식으로 출력 

set disassembly-flavor att

 어셈블리어를 AT&T 형식으로 출력 

set follow-fork-mod child 

 자식 프로세스에  gdb attach

set follow-exec-mode new

 exec로 실행되는 바이너리에 gdb를 attach 

finish 

 현재 함수를 수행하고 탈출

 현재 루프를 탈출 

disas [주소] [주소]

 주소 사이의 어셈블리 코드를 출력

list

 디버깅 중인 프로그램 C언어 소스를 출력 

bt 

 현재 프로그램 스택에 있는 내용 출력 



출처 : Mera_ssom 정보보호/일상 블로그

GDB 명령어 정리 상세 : Here

'Study > 기타' 카테고리의 다른 글

gdb peda 설치 방법  (0) 2019.10.31
No such file or directory 해결 방법  (0) 2019.10.31
파워셸(powershell)  (0) 2019.10.17
PEDA GDB 명령어  (0) 2019.10.12
우분투 저장소 변경 방법  (0) 2019.10.12

+ Recent posts