c#
- c++의 연산력 + Visual Basic의 편의성
- 객체지향 프로그래밍언어
- 넷 프레임워크에 최적화
namespace란?
관련 구조체, 클래스, 델리게이트, 인터페이스 등을 그룹화 한 것
class : C# 프로그램을 구성하는 기본 단위
- field : 정적인 상태
- method : 동적인 기능
c#
namespace란?
관련 구조체, 클래스, 델리게이트, 인터페이스 등을 그룹화 한 것
class : C# 프로그램을 구성하는 기본 단위
- field : 정적인 상태
- method : 동적인 기능
android:orientation="vertical" 줄바꿈
# LinearLayout은 한가지 방향으로만 출력할 수 있다. 방향을 바꾸고 싶다면, 중첩하여 사용하면 된다.
android:text="Color Test" 텍스트 내용
android:textSize="30sp" 텍스트 크기# dp, in, mm, pt, px, sp의 단위가 있다.
android:textColor="#5c355c" 텍스트 색상
# html 색상 코드를 사용한다.
android:textStyle="bold|italic"/> 텍스트 스타일
코드를 보니 RET 제외한 스택을 전부 0으로 초기화 시킨다.
아무리 봐도 모르겠어서 예전에도 한번 여기서 막혀서 일단 다른사람이 어떻게 풀었는지 참조하면서 공부했다.
찾아보니 LD_PRELOAD 라는 것을 사용해서 푸는 것이라고 한다.
LD_PRELOAD는 dynamic linker 가 해당 경로의 so 파일을 공유 라이브러리로 무조건 선적재함.
라고 정의 되어있지만, 간단히 말해 프로그램이 시작될때 참조하는 것이라고 기억해두었다.
다음과 같은 코드를 짠 후
* stdio.h를 포함하지 말아야한다.
컴파일 옵션을 저렇게 주고, LD_PRELOAD를 등록 시킨 후
실행 시키면 놀랍게도 이렇게 쉘이 따인다.
그대로 golem에 적용시켜보려고 했더니 이렇게 먹히질 않는다.
아마도 실행되는 권한이 바뀌면서 LD_PRELOAD가 먹히지 않는 것이라고 생각하였다
혹시나 하고 다른 여러가지 실험을 해보았다.
먼저 /bin/my-pass의 권한에 setuid 비트가 걸려있는지 확인을 해보았다.
걸려있지 않았다 my-pass는 geteuid를 호출할때 setuid비트가 걸린 계정의 암호를 보여주기 때문에 setuid비트를 걸지 못한다.
이렇게 훨씬 상위의 비밀번호도 알아낼수 있었다.
일단 이렇게 아무동작도 안하는 프로그램을 하나 생성해서 이름을 쉘코드로 만들어 컴파일 해준다.
[LOB] vampire (0) | 2016.07.23 |
---|---|
[LOB] troll (0) | 2016.07.17 |
[LOB] orge (0) | 2016.07.17 |
[LOB] darkelf (0) | 2016.07.17 |
[LOB] wolfman (0) | 2016.07.17 |
코드를 보면 ultra argv hunter 라고 argv를 모두 초기화 시키는 부분이 추가되었다.
처음에는 어떻게 할지 모르겠어서 일단 코드를 보고 심볼릭링크가 필요하다는 것을 알았다.
gdb 권한문제 때매 파일 명 길이가 같은 새 파일에 복사 후 심볼릭 링크를 걸어주었다.
쉘코드는 이것을 사용하였다.
\x68\x8a\xe2\xce\x81\x68\xb1\x0c\x53\x54\x68\x6a\x6f\x8a\xe4\x68\x01\x69\x30\x63\x68\x69\x30\x74\x69\x6a\x14\x59\xfe\x0c\x0c\x49\x79\xfa\x41\xf7\xe1\x54\xc3
구글링을 통해 스택 레이아웃을 다시 한번 살펴보았다.
https://www.win.tue.nl/~aeb/linux/hh/stack-layout.html
마지막 부분에 program name이 남는 것을 볼 수 있었다.
혹시나 해서 한번 시도해보았다.
정말로 마지막 부분에 프로그램 이름이 남아있었다.
그래서 이부분에서 nop 주소중 하나를 골라서 ret에 덮었더니 성공하였다.
Flag : shellcoder
[LOB] skeleton (0) | 2016.07.24 |
---|---|
[LOB] troll (0) | 2016.07.17 |
[LOB] orge (0) | 2016.07.17 |
[LOB] darkelf (0) | 2016.07.17 |
[LOB] wolfman (0) | 2016.07.17 |
소스가 많이 줄어들었다.
이번에는 \xff를 필터링 하고 있다.
| argv[2] | argv[1] | argv[0] |
-->>>
스택의 진행 방향이다.
argv[2]의 크기가 커질 수록 argv[1]는 더 낮은 주소에서 시작되게 된다.
이렇게 3번쨰 인자값을 늘리면서 0xbffff 가 아닌 주소값을 찾아내었다.
Flag : music world
[LOB] skeleton (0) | 2016.07.24 |
---|---|
[LOB] vampire (0) | 2016.07.23 |
[LOB] orge (0) | 2016.07.17 |
[LOB] darkelf (0) | 2016.07.17 |
[LOB] wolfman (0) | 2016.07.17 |
코드를 보면 argv[0]을 초기화 시키는 구문이 사라지고, argv[1]을 초기화 시키고 있다.
따라서 argv[0]을 이용하여 문제를 풀어야한다.
이렇게 코드를 만들고, argv[0]의 주소를 구한다.
argv[0]에 쉘코드를 넣어야 하는데, 어떻게 넣어야 할까 하다 이름 자체를 변경하여 넣기로 하였다.
하지만 쉘코드 중간에는 "\x2f" 라는 부분이 있는데 이 부분은 디렉토리를 구분해주는 인자이기 때문에 계속 오류가 떴다.
그래서 다음과 같은 쉘코드를 사용하였다.
\xeb\x11\x5e\x31\xc9\xb1\x32\x80\x6c\x0e\xff\x01\x80\xe9\x01\x75\xf6\xeb\x05\xe8\xea\xff\xff\xff\x32\xc1\x51\x69\x30\x30\x74\x69\x69\x30\x63\x6a\x6f\x8a\xe4\x51\x54\x8a\xe2\x9a\xb1\x0c\xce\x81
이렇게 복사후
쉘을 땄다.
Flag : aspirin
[LOB] vampire (0) | 2016.07.23 |
---|---|
[LOB] troll (0) | 2016.07.17 |
[LOB] darkelf (0) | 2016.07.17 |
[LOB] wolfman (0) | 2016.07.17 |
[LOB] orc (0) | 2016.07.17 |
argv[0]을 77자로 체크하는 구문이 추가되었다. 따라서 심볼릭 링크로 파일명을 바꿔준 후 실행하는 방법을 쓴다.
다음과 같이 코드를 짜고
심볼릭링크를 걸어준다.
주소를 따준 후에
실행 해준다.
전 단계와 같은 방법으로 하되, argv[0]의 값만 신경써주면 된다
Flag : timewalker
[LOB] troll (0) | 2016.07.17 |
---|---|
[LOB] orge (0) | 2016.07.17 |
[LOB] wolfman (0) | 2016.07.17 |
[LOB] orc (0) | 2016.07.17 |
[LOB] goblin (0) | 2016.07.17 |
코드를 보니 argu의 길이를 확인하는 구문이 새로 생겼다.
buffer 주소값과 argv의 주소값을 찾도록 복붙하였다.
주소값을 구했다.
처음 두번과 같이 argument를 제약한다.
buffer(40) + sfp(4) + ret(4) 이므로 딱 48바이트가 된다. 있으나마나 한 제약이라
전 단계의 페이로드를 그대로 쓰면 된다.
Flag : kernel crashed
[LOB] orge (0) | 2016.07.17 |
---|---|
[LOB] darkelf (0) | 2016.07.17 |
[LOB] orc (0) | 2016.07.17 |
[LOB] goblin (0) | 2016.07.17 |
[LOB] cobolt (0) | 2016.07.12 |
실행시켜보면 overflow me을 출력한다.
이게 코드이다.
gdb로 까보니 배열과 key사이의 거리는 52인것을 알수 있다.
Flag : daddy, I just pwned a buFFer :)
pwnable.kr / col (0) | 2016.04.09 |
---|---|
pwnable.kr / fd (0) | 2016.04.07 |
코드를 보면 전레벨과 동일하지만, 마지막에 buffer hunter라는 구문이 추가되었다.
argv[1]의 주소에도 인자가 쓰여져 있으므로 argv[1]의 주소를 덮으면 된다.
근데 실수로 버퍼를 이용해서 풀어버렸다.
왜 버퍼헌터가 작동 되지않은것은 잘 모르겠다.
이렇게 argv[1]의 주소를구해 덮는 방법도 있다.
Flag : love eyuna
[LOB] darkelf (0) | 2016.07.17 |
---|---|
[LOB] wolfman (0) | 2016.07.17 |
[LOB] goblin (0) | 2016.07.17 |
[LOB] cobolt (0) | 2016.07.12 |
[LOB] gremlin (0) | 2016.07.12 |