Pwnable!!

정말... 익스하는데 뭐가 잘못된지 모르겠는데 자꾸 프로그램은 죽고 마ㅣㄴ어ㅣㅏ러


그래서 pwntools에서 gdb를 붙여 사용할 수 있다고 해서 찾아봤다.

사용법은 아래와 같다. ... 라고하는데 사용을 못하겠다 ㅡㅡ; 그냥 디버그 모드사용;


1
2
3
4
5
6
7
def lanuch_gdb(): 
    p = process("./binary")
    context.terminal = ['gnome-terminal''-x''sh''-c'
    gdb.attach(proc.pidof(p)[0])
 
#break point
gdb.attach(proc.pidof(p)[0], execute='b *0x4005d6\nc\n')
cs



디버그모드라고 코드 맨위에 context.log_level = 'debug' 라고 추가해주면 된다. 매우 편리..



tmux를 이용한 gdb.attach 방법


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#!/usr/bin/python
from pwn import *
context.arch = 'amd64'
context.terminal = ['tmux''splitw''-h']
 
script = '''
b gets
'''
 
shellcode = asm(shellcraft.sh())
payload = shellcode + "A"*80
 
 
payload += p64(0x4141414142424242+ p64(0x7fffffffe400)
 
= process("./vuln1")
 
gdb.attach(p, script)
 
p.sendline(payload)
p.interactive()
 
cs



tmux를 킨 다음에 사용할 수 있다.

script에 gdb로 설정할 것을 적은 후 실행하면 창 분리한 후 실행되어 사용하기 좋다.



pwntools 사용해서 LD_PRELOAD 설정하기


1
process(["./challenge"], env={'LD_PRELOAD':'./libc.so.1'})
cs





lib = ELF("라이브러리")


lib.symbols['함수명'] 으로 offset값을 얻어올 수 있다.


여기서 stdout이나 stdin의 offset을 구할때 그냥 lib.symbols['stdout']이나 lib.symbols['stdin']으로 해서 offset을 구해서 stdout,stdin의 위치를 계산하면 굉장히 엉뚱한 값이 나오므로 주의하자 ㅡㅡ; 이것때문에 꽤나 삽질했다. stdin이나 stdout의 offset은 아래와 같이 해서 구하자.


stdout_offset = lib.symbols['_IO_2_1_stdout_']

stdin_offset = lib.symbols['_IO_2_1_stdin_']


함수명은 그냥 함수명으로 찾아주면 된다.

system_offset =  lib.symbols['system']



참고로 문제풀때 바이너리와 라이브러리까지 함께 주어졌다면 process에 LD_PRELOAD로 라이브러리를 설정해주는게 심적으로 좋음...

아래는 pctf shop문제에서 env값으로 LD_PRELOAD 설정예시


1
2
env = {"LD_PRELOAD": os.path.join(os.getcwd(), "libc.so.6")}
= process("./shop", env=env)
cs


github : https://github.com/niklasb/libc-database




libc-database 설명

http://kaspyx.tistory.com/86

http://9oat.tistory.com/3?category=617724


메모리 릭 기법

http://9oat.tistory.com/4?category=617724

예를 들어 ls -al을 치고싶은데 공백이 필터되므로.. 아래와 같이 가능


ls$IFS-al


와.. 이거 알았으면 pctf에서 써먹었겟네...ㅋㅋㅋ

출처 : 2015 Christmas CTF 톡방(어쩌다보니 들어가보니 있었다.)


자세한 내용 : http://bash.cyberciti.biz/guide/$IFS

Memory Leak 기법

2018. 5. 15. 21:29

메모리누수란?

http://story.wisedog.net/%EB%A9%94%EB%AA%A8%EB%A6%AC-%EB%88%84%EC%88%98-memory-leak%EB%9E%80/


Memory Leak 기법

http://9oat.tistory.com/4?category=617724



pwntools을 이용한 간단한 ROP 문제풀이

http://kaka09.tistory.com/34



MEMORY_LEAK_TECHNIQUES_cd80

MEMORY_LEAK_TECHNIQUES_cd80.pdf


pwntools를 이용한 socket

2018. 5. 15. 00:12
1
2
3
4
5
6
7
8
9
10
11
#!/usr/bin/env python
from pwn import *
 
conn = remote('host'12345)
 
print(conn.recvuntil('|$|>'))    
conn.sendline("ho...")
print(conn.recvline())
 
#conn.shutdown()  # Ctrl+D
conn.interactive()
cs


'Pwnable!!' 카테고리의 다른 글

리눅스 Command Injection 공백 필터우회  (0) 2018.05.18
Memory Leak 기법  (0) 2018.05.15
메모리 보호기법 공부 및 우회법 (사이트)  (0) 2018.05.03
Stack Canary 우회  (0) 2018.05.03
netstat으로 열려있는 포트찾기  (0) 2018.05.03

여기에 잘정리되어 있어서 가서 보자


메모리 보호기법 우회 연구분석보고서

1. Windows/Linux 환경에서의 Stack Overflow  보호기법

2. ROP(Return Oriented Programming

3. SEH(Structed Exception Handling) Overwrite


스택의 더미값 대충이라도 알아내기

http://www.hackerschool.org/HS_Boards/data/Lib_system/dummy3.txt


리눅스 - 메모리 보호 옵션(ref)

http://bbolmin.tistory.com/81


Windows bufferoverflow (5) - ROP 1 (DEP 와 우회방법)

http://hyunmini.tistory.com/29

'Pwnable!!' 카테고리의 다른 글

Memory Leak 기법  (0) 2018.05.15
pwntools를 이용한 socket  (0) 2018.05.15
Stack Canary 우회  (0) 2018.05.03
netstat으로 열려있는 포트찾기  (0) 2018.05.03
포너블을 위한 툴들  (0) 2018.04.30

Stack Canary 우회

2018. 5. 3. 23:33

canary 란?

메모리 보호 기법 중 하나.


랜덤 값인 canary 를 ebp 와 지역 변수 사이에 위치시킵니다.

함수가 시작할 때 canary 값을 저장하고, 함수가 끝나기 전에 canary 값이 변조됐는지 여부를 체크합니다.


윈도우에서는 스택 쿠키(stack cookie)라고도 하는듯.


bof를 해서 return address 를 덮어 실행흐름을 바꾸려할 때, canary 값까지 덮어버리면 함수가 끝나기 전에 canary 값이 변조된 것을 보고 프로그램을 종료시키게 된다. 이 때 canary 값이 변조되었을 경우 *** stack smashing detected *** 라고 뜨면서 종료된다.


아이다(Ida)로 봣을 때는 코드상 저부분이고


gdb로 보면 밑줄 친 저부분이다.



그리고 저것이 SSP (Stack Smashing Protector)라는 것이다.

SSP로 컴파일되면 아래와 같은 구조가 된다.



그리고 지역변수가 있다면 스택의 순서도 바꿔준다. 


1
2
3
4
5
6
7
int main()
{
    int check1;
int check2;
    char buf[50];
 
    return 0;
}
cs


위와 같은 코드가 있으면 이론적으로 스택구조는 아래 순서가 된다.

buf - check2 - check1 - sfp - ret - arg ...


그러나 SSP는 이런 지역변수의 순서를 바꾸어주어 아래와 같이 된다.

check2 - check1 - buf - check - canary - xxx -  sfp - ret - arg ...


물론 카나리도 추가된다.


우회법


1. Brute Force

canary값은 4byte이므로 1byte씩 브루트포싱을 하면서 canary값을 알아낼 수 있다. buffer을 모두 채운다음 다음 4바이트가 Canary일 때 1바이트씩 canary값을 덮으면서 만약 *** stack smashing detected ***으로 종료되면 이것은 틀린것이고, 아니라면 맞는것이므로 이렇게 알아낼수 있다.

범위는 0x00~0xFF로 256가지이고 이걸 4번만 하면 된다.


1-1. fork를 사용할 때에 유효

fork는 프로세스를 복제하는데 이 뜻은 부모와 자식이 동일한 카나리를 공유한다는 뜻이다. 몇번의 시도로 카나리를 추측할 수 있다면 카나리를 찾을 수 있다는 뜻이다. 공격 방식에 따라 카나리 하위 한바이트 한바이트씩 추측해서 카나리를 예측 할 수 있음.


2. recv, strncpy

rev와 strncpy 함수는 문자열을 입력받을시 NULL이 들어가지 않는다. 이를 이용해 buffer가 printf()된다면 buffer를 꽉채워 null을 없애 canary까지 출력하게 할 수 있다.


3. Canary 루틴 노출

Canary를 만드는 루틴이 노출될 경우 역연산을 통해서 canary를 알아낼 수 있다.


4. scanf("%d", var[i]); 에서 i가 범위를 넘어서 카나리값을 넘어 입력할 수 있을때

원래는 숫자만 입력가능하다. 문자가 입력될 경우, 문자가 버퍼에 남게되어 모든 scanf("%d")가 통과되어버리는데,

문자열 +, -는 예외로 입력가능하다. 게다가 버퍼에 남지도 않을뿐더러 해당 변수에 아무런 값도 저장하지않고 다음으로 넘어갈 수 있기때문에

카나리를 손상시키지않고 return addresss만 변조시킬수 있다.


5. pthread를 사용.

pthread에서 canary 유출가능

https://xerxes-break.tistory.com/405?category=679890


참고한 곳:

[poxx2016] canaria(150pt) 문제풀이 : https://bpsecblog.wordpress.com/2016/12/09/poxx2016-canaria/

리눅스 메모리 보호기법 우회 연구분석보고서 : http://teamcrak.tistory.com/330

SSP - Stack Canary에 대한 Phrack 자료 번역 : http://hackability.kr/entry/SSP-Stack-Canary%EC%97%90-%EB%8C%80%ED%95%9C-Phrack-%EC%9E%90%EB%A3%8C-%EB%B2%88%EC%97%AD

[Codegate 2016] watermelon write up : 다른분, 출제자


netstat -an | grep "LISTEN"

'Pwnable!!' 카테고리의 다른 글

메모리 보호기법 공부 및 우회법 (사이트)  (0) 2018.05.03
Stack Canary 우회  (0) 2018.05.03
포너블을 위한 툴들  (0) 2018.04.30
Linux/x64 Shellcode 모음 (64bit / 64비트)  (0) 2018.04.30
gdb PEDA 사용 + pwngdb  (0) 2018.04.28

포너블을 위한 툴들

2018. 4. 30. 23:49

포너블을 위한 툴들

'Pwnable!!' 카테고리의 다른 글

Stack Canary 우회  (0) 2018.05.03
netstat으로 열려있는 포트찾기  (0) 2018.05.03
Linux/x64 Shellcode 모음 (64bit / 64비트)  (0) 2018.04.30
gdb PEDA 사용 + pwngdb  (0) 2018.04.28
pwntools 사용법  (0) 2018.04.27

+ Recent posts