Pwnable!!
- Pwntool gdb attach 및 debug모드 + LD_PRELOAD 2018.05.23
- pwntools를 이용해서 libc에서 함수 및 stdin,stdout 오프셋구하기 2018.05.22
- libc-database를 이용한 함수 주소 구하기 2018.05.21
- 리눅스 Command Injection 공백 필터우회 2018.05.18
- Memory Leak 기법 2018.05.15
- pwntools를 이용한 socket 2018.05.15
- 메모리 보호기법 공부 및 우회법 (사이트) 2018.05.03
- Stack Canary 우회 2018.05.03
- netstat으로 열려있는 포트찾기 2018.05.03
- 포너블을 위한 툴들 2018.04.30
Pwntool gdb attach 및 debug모드 + LD_PRELOAD
정말... 익스하는데 뭐가 잘못된지 모르겠는데 자꾸 프로그램은 죽고 마ㅣㄴ어ㅣㅏ러
그래서 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) p = 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 |
'Pwnable!!' 카테고리의 다른 글
linux에서 lib64의 base address 확인 및 팁 (0) | 2018.05.24 |
---|---|
64bit ROP & 64bit BOF (0) | 2018.05.24 |
pwntools를 이용해서 libc에서 함수 및 stdin,stdout 오프셋구하기 (0) | 2018.05.22 |
libc-database를 이용한 함수 주소 구하기 (0) | 2018.05.21 |
리눅스 Command Injection 공백 필터우회 (0) | 2018.05.18 |
pwntools를 이용해서 libc에서 함수 및 stdin,stdout 오프셋구하기
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")} p = process("./shop", env=env) | cs |
'Pwnable!!' 카테고리의 다른 글
64bit ROP & 64bit BOF (0) | 2018.05.24 |
---|---|
Pwntool gdb attach 및 debug모드 + LD_PRELOAD (0) | 2018.05.23 |
libc-database를 이용한 함수 주소 구하기 (0) | 2018.05.21 |
리눅스 Command Injection 공백 필터우회 (0) | 2018.05.18 |
Memory Leak 기법 (0) | 2018.05.15 |
libc-database를 이용한 함수 주소 구하기
github : https://github.com/niklasb/libc-database
libc-database 설명
http://kaspyx.tistory.com/86
http://9oat.tistory.com/3?category=617724
메모리 릭 기법
'Pwnable!!' 카테고리의 다른 글
Pwntool gdb attach 및 debug모드 + LD_PRELOAD (0) | 2018.05.23 |
---|---|
pwntools를 이용해서 libc에서 함수 및 stdin,stdout 오프셋구하기 (0) | 2018.05.22 |
리눅스 Command Injection 공백 필터우회 (0) | 2018.05.18 |
Memory Leak 기법 (0) | 2018.05.15 |
pwntools를 이용한 socket (0) | 2018.05.15 |
리눅스 Command Injection 공백 필터우회
예를 들어 ls -al을 치고싶은데 공백이 필터되므로.. 아래와 같이 가능
ls$IFS-al
와.. 이거 알았으면 pctf에서 써먹었겟네...ㅋㅋㅋ
출처 : 2015 Christmas CTF 톡방(어쩌다보니 들어가보니 있었다.)
자세한 내용 : http://bash.cyberciti.biz/guide/$IFS
'Pwnable!!' 카테고리의 다른 글
pwntools를 이용해서 libc에서 함수 및 stdin,stdout 오프셋구하기 (0) | 2018.05.22 |
---|---|
libc-database를 이용한 함수 주소 구하기 (0) | 2018.05.21 |
Memory Leak 기법 (0) | 2018.05.15 |
pwntools를 이용한 socket (0) | 2018.05.15 |
메모리 보호기법 공부 및 우회법 (사이트) (0) | 2018.05.03 |
Memory Leak 기법
메모리누수란?
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 문제풀이
MEMORY_LEAK_TECHNIQUES_cd80
MEMORY_LEAK_TECHNIQUES_cd80.pdf
'Pwnable!!' 카테고리의 다른 글
libc-database를 이용한 함수 주소 구하기 (0) | 2018.05.21 |
---|---|
리눅스 Command Injection 공백 필터우회 (0) | 2018.05.18 |
pwntools를 이용한 socket (0) | 2018.05.15 |
메모리 보호기법 공부 및 우회법 (사이트) (0) | 2018.05.03 |
Stack Canary 우회 (0) | 2018.05.03 |
pwntools를 이용한 socket
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)
Windows bufferoverflow (5) - ROP 1 (DEP 와 우회방법)
'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 우회
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 : 다른분, 출제자
'Pwnable!!' 카테고리의 다른 글
pwntools를 이용한 socket (0) | 2018.05.15 |
---|---|
메모리 보호기법 공부 및 우회법 (사이트) (0) | 2018.05.03 |
netstat으로 열려있는 포트찾기 (0) | 2018.05.03 |
포너블을 위한 툴들 (0) | 2018.04.30 |
Linux/x64 Shellcode 모음 (64bit / 64비트) (0) | 2018.04.30 |
netstat으로 열려있는 포트찾기
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 |
포너블을 위한 툴들
'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 |