https://www.megabeets.net/a-journey-into-radare-2-part-2/

Prologue

radare2에 대한 우리 여행의 두번째 파트에 다시 오신 것을 환영합니다! 이 부분에서는 radare2의 기능에 대해 더 자세히 다루겠습니다. 이번에는 binary exploitation에 중점을 두었습니다.

여러분 중 많은 분이 두번째 파트를 기다렸습니다. 여기 있습니다! 다음 부분을 더 빨리, 더 빨리 게시하기를 바랍니다. 이 시리즈의 첫 번째 부분을 읽지 않았다면 그렇게 할 것을 적극 권장(https://www.megabeets.net/a-journey-into-radare-2-part-1/)합니다. Radare2의 기본 사항을 설명하고 여기에서 사용할 많은 명령을 설명합니다.

시리즈의 이번 파트에서는 간단한 바이너리를 Exploiting 하는 것에 초점을 맞출 것입니다. radare2에는 많은 기능이 있습니다. 이 게시물의 끝에 Reference Sheet를 확인할 수 있습니다. 오늘 저는 이 멋진 기능 중 일부를 보여드릴 것이며 우리는 함께 radare2를 사용하여 nx protected 바이너리를 우회할 것 입니다. 저는 이 글을 읽는 여러분이 이미 다음의 전제 조건에 익숙하다고 생각합니다.

  • Assembly code
  • Exploit mitigations (NX, ASLR)
  • Stack structure
  • Buffer Overflow
  • Return Oriented Programming
  • x86 Calling Conventions

이러한 주제에 익숙해지는 것이 중요합니다. 그 주제에 깊이 이야기하지 않거나 심지어 그 중 일부를 간략하게 설명하지 않기 때문입니다.


Getting familiar with our binary

아래의 바이너리는 main () 함수에 약간의 변경을 가한 이전 게시물의 바이너리와 비슷합니다.

  • -fno-stack-protector 및 -z execstac없이 컴파일하여 NX bit 가능
  • scanf로 사용자 입력을 받습니다.
  • 대부분 put을 사용하여 화면에 출력합니다.
  • 프로그램의 출력 시 약간의 변화가 있습니다.

아래 소스코드는 이전 게시물에서 사용된 main() 입니다.

int main(int argc, char *argv[])
{
    printf("\n  .:: Megabeets ::.\n");
    printf("Think you can make it?\n");
    if (argc >= 2 && beet(argv[1]))
    {
        printf("Success!\n\n");
    }
    else
        printf("Nop, Wrong argument.\n\n");
 
    return 0;
}



이번에 사용될 main()은 아래와 같습니다.

int main(int argc, char *argv[])
{
    char *input; 
    puts("\n  .:: Megabeets ::.\n");
    puts("Show me what you got:");
    
    scanf("%ms"&input);
    if (beet(input))
    {
        printf("Success!\n\n");
    }
    else
        puts("Nop, Wrong argument.\n\n");
 
    return 0;
}


여기에서 바이너리를 다운로드하고 여기에서 소스를 다운로드 할 수 있습니다.

소스를 직접 컴파일하려면 다음 명령을 사용하십시오.

1
$ gcc -m32 megabeets_0x2.c -o megabeets_0x2

바이너리의 기능은 매우 간단하며 이전 게시물에서 살펴 보았습니다. 사용자 입력을 요청하고 입력에 대해 rot13을 수행 한 다음 문자열 "Megabeets"에서 rot13의 결과와 비교합니다. 입력은 'Zrtnorrgf'여야합니다.

$ ./megabeets_0x2 
 
  .:: Megabeets ::.
 
Show me what you got:
blablablabla
Nop, Wrong argument.
 
$ ./megabeets_0x2 
 
  .:: Megabeets ::.
 
Show me what you got:
Zrtnorrgf
Success!

오늘날 우리의 포스트는 단순한 Crackme를 크랙킹하는 것이 아니라 exploiting하는 것 입니다. Let’s get to the work!


Understanding the vulnerability

모든 익스플로잇 문제와 마찬가지로 Security Protection이 구현된 바이너리를 확인하는 것은 좋은 습관입니다. 우리는 마지막 게시물에서 보여준 rabin2를 사용하거나 단순히 radare의 쉘에서 i를 실행하여 수행할 수 있습니다. 우리가 아직 radare로 바이너리를 열지 않았으므로, 우리는 rabin2 메소드를 이용해 확인해 봅시다.

$ rabin2 -I megabeets_0x2
 
arch     x86
binsz    6072
bintype  elf
bits     32
canary   false
class    ELF32
crypto   false
endian   little
havecode true
intrp    /lib/ld-linux.so.2
lang     c
linenum  true
lsyms    true
machine  Intel 80386
maxopsz  16
minopsz  1
nx       true
os       linux
pcalign  0
pic      false
relocs   true
relro    partial
rpath    NONE
static   false
stripped false
subsys   linux
va       true

표시된 행에서 볼 수 있듯이 바이너리 파일은 NX로 보호되어 있으므로 실행 스택이 필요 없습니다. 또한 파일은 canary, relo, pic으로 보호되진 않습니다.

이제는 프로그램의 흐름을 빠르게 살펴볼 차례입니다. 디스 어셈블리 (소스 코드가 항상있는 것은 아닙니다)를 이용해 해당 프로그램을 살펴봅시다. radare2를 사용하여 디버그 모드에서 프로그램을 엽니다.

$ r2 -d megabeets_0x2
Process with PID 20859 started…
= attach 20859 20859
bin.baddr 0x08048000
Using 0x8048000
Assuming filepath /home/beet/Desktop/Security/r2series/0x2/megabeets_0x2
asm.bits 32– Your endian swaps
[0xf7782b30]> aas


  • -d 디버그 모드로 오픈
  • aas 함수, 심볼 등등을 분석

이전 게시물에서 언급했듯이, aaa로 시작하는 것은 분석이 매우 복잡한 프로세스이므로 항상 권장되는 접근 방식은 아닙니다.

이제 메인에 도달할 때까지 실행 프로세스를 계속 진행하십시오. dcu main을 실행하면 쉽게 할 수 있습니다.

[0xf7797b30]> dcu?
|Usage: dcu Continue until address
| dcu address      Continue until address
| dcu [..tail]     Continue until the range
| dcu [from] [to]  Continue until the range

[0xf7797b30]> dcu main
Continue until 0x08048658 using 1 bpsize
hit breakpoint at: 8048658

이제 VV를 눌러 비주얼 그래프 모드로 들어가 보겠습니다. 이제 VV를 눌러 비주얼 그래프 모드로 들어가 보겠습니다. 첫 번째 부분에서 설명했듯이 p와 P를 사용하여 뷰를 전환하고 h / j / k / l을 사용하여 왼쪽 / 아래 / 위 / 오른쪽으로 이동하고 점프 호출 옆에 표시된 키와 g를 사용하여 함수로 점프 할 수 있습니다. (eg gd).

main()은 우리 프로그램이 (scanf()를 통해) 입력을 요구하고 이 입력을 sym.beet에 전달하는 함수입니다. gc를 누르면 입력을 처리하는 beet() 함수로 점프 할 수 있습니다 :




















---------------- To do ---------------

















+ Recent posts